当一个 C 程序在 z/Linux 下调用另一个函数时使用什么样的链接

问题描述

当 C 程序在 z/OS 下调用外部例程时,会使用特定的链接,具体取决于用于调用外部例程和从外部例程返回的指令。

用例 - 1

使用标准的分支和链接序列,GPR14 有返回地址,GPR15 有被调用的程序的入口点地址,GPR13 包含一个 72 字节寄存器保存区的地址,用于保存 GPR14、GPR15、 GPR0,GPR1,GPR2,GPR3,GPR4,GPR5,GPR6,GPR7,GPR8,GPR9,GPR10,GPR11 AND GPR12,寄存器保存区的前12个字节包含,一个4字节值可以有多种含义,一个后向寄存器保存区域指针和前向寄存器保存区域指针。被调用程序负责将调用者寄存器保存在传递的寄存器保存区中,并获取一个新的寄存器保存区供其使用,并将获取到的寄存器保存区的地址加载到r13中。

返回调用程序,执行程序从寄存器保存区恢复gpr13和gpr14、gpr15、gpr0-gpr12,然后跳转到gpr14中的地址,寄存器gpr0和gpr1不恢复但可用于将值返回给调用程序。

用例 - 2 如果被调用的路由选择在入口处使用分支和堆栈指令,则调用者寄存器将存储在链接堆栈条目中。被调用的程序负责获取一个新的寄存器保存区并将得到的寄存器保存区的地址加载到 r13 中。返回时,被调用程序发出 PR(程序返回指令),这会恢复调用者 gpr14、gpr15 和 gpr2-gpr13,gpr0 和 gpr1 不会恢复,但可用于向调用程序返回值。链接堆栈条目被释放。

在上述两个用例中,进入和退出链接因被调用程序是作为不可重入程序还是作为可重入程序执行而有所不同。

回到我提出的问题,在 z/Linux 下,如果 C 程序要调用外部例程,入口和出口链接会是什么样子。

感谢您选择分享的任何信息。

京东

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)