我是一名长期的汇编程序程序员,现在进入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 */ \
);
,并且处理起来要简单得多(更少的指令,没有绑定时间问题)。我真的在寻找可以使编译器“做正确的事”的东西。
斯科特
答案 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程序的绑定时可用。
希望这会有所帮助,
标记