参数传递-非标准链接

时间:2019-09-26 02:22:30

标签: zos metalc

我是一名长期的汇编程序程序员,现在进入Metal C领域。我是C的新手,因此我的术语可能反映了我所知道的知识和我正在学习的知识。当然,它将使我了解事物的方式变色。

我正在尝试将新的Metal C代码插入一些不一定遵循标准条目链接约定的旧组件。

例如,服务例程将要处理的控制块的地址作为R1中的输入。我已经看过《 Metal C用户指南》中有关参数传递的讨论和语言参考中的#pragma链接讨论,似乎没有办法使编译器执行此操作。

本质上,我想声明一个由以下汇编器调用的例程:

     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     */ \
);                                                                                                

,并且处理起来要简单得多(更少的指令,没有绑定时间问题)。我真的在寻找可以使编译器“做正确的事”的东西。

斯科特

1 个答案:

答案 0 :(得分:0)

您可以在C程序中尝试以下操作:

#pragma linkage(MYHLASM,OS)

然后像这样调用函数:

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程序的绑定时可用。

希望这会有所帮助,

标记