簡體   English   中英

參數傳遞——非標准聯動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM