![](/img/trans.png)
[英]Issue passing parameters to a COBOL program using JCL PARM= on the EXEC statement
[英]Parameter Passing - Non-standard Linkage
我是一名長期的匯編程序員,正在進入 Metal C 的世界。 我是一個 C 新手,所以我的術語可能反映了我知道的東西和我正在學習的東西。 它肯定會影響我對事物的理解。
我正在嘗試將新的 Metal C 代碼插入一些不一定遵循標准入口鏈接約定的舊組件中。
例如,服務例程將要處理的控制塊的地址作為 R1 中的輸入。 我在語言參考中關於參數傳遞和#pragma 鏈接討論的討論中查看了Metal C 用戶指南,似乎沒有辦法讓編譯器執行此操作。
本質上,我想聲明一個由以下匯編程序調用的例程:
L R1,MyParm@ Put pointer to Parm into R1
L R15,Routine@ Get address of service routine
BASR R14,R15 Branch to service routine
我意識到我可以采用上述方法,對其進行參數化並將其放入 __asm() 塊中,但我希望程序盡可能“干凈”。
謝謝,斯科特
附錄 - 2019 年 9 月 26 日
為了回應 Mark Hiscock 在下面的回答,這樣的 __asm() 塊看起來像:
#define CallwithR1(ParmPtr,RoutinePtr,RC,Rsn) \
__asm( \
" L R1,%2 Get ParmPtr into R1 \n" \
" L R15,%3 Get RoutinePtr into R15 \n" \
" BALR R14,R15 Call the routine \n" \
" ST R15,%0 Save the return code \n" \
" ST R0,%1 Save the reason code \n" \
/* Output variables */ \
: "=m"(RC) /* %0, output only, in-memory */ \
,"=m"(Rsn) /* %1, output only, in memory */ \
/* Input variables */ \
: "m"(ParmPtr) /* %2, input, in-memory */ \
,"m"(RoutinePtr) /* %3, input, in-memory */ \
/* Register clobber list */ \
: "r0" /* R0 clobbered by reason code */ \
,"r1" /* R1 clobbered by linkage code */ \
,"r14" /* R14 clobbered by return addr */ \
,"r15" /* R15 clobbered by return code */ \
);
並且處理起來會簡單得多(指令更少,沒有綁定時間問題)。 我真的在尋找能讓編譯器“做正確的事”的東西。
斯科特
您可以在 C 程序中嘗試這樣的操作:
#pragma linkage(MYHLASM,OS)
然后像這樣調用 function:
MYHLASM(&pointerToParmWhichBecomesR1);
然后匯編器看起來像這樣:
MYHLASM CSECT ,
MYHLASM AMODE 64
MYHLASM RMODE 31
STG 14,12(13)
LG 2,0(,1)
USING *,15
DO SOMETHING WITH THE PARM ADDR WHICH IS NOW IN R2
LG 14,12(13)
BR 14
LTORG
END
這是一個 64 位示例,MYHLASM 必須在 C 程序的綁定時可用。
希望這可以幫助,
標記
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.