PR指令对空堆栈有什么影响

时间:2018-01-10 19:51:35

标签: zos mvs

当我在不使用链接堆栈的程序中发出PR(程序返回)指令时,程序立即结束。我想利用这种行为,但我想知道除了退出我的程序之外是否会导致任何意想不到的结果?我已经阅读了操作手册中的PR描述,但没有看到任何回答我问题的内容。

如果PR指令不适合立即终止程序,那么我应该使用另一种方法吗?

2 个答案:

答案 0 :(得分:1)

通常一个用于保存调用者寄存器的入口逻辑。例外包括用于为调用者设置寄存器值的代码。

如果您想将BR返回给BASR的返回寄存器。简单地退出整个过程并不是一个好主意,因为你不知道如何调用它。也许程序A调用了你。也许是一个调用B来调用调用你的C,而A,B和C都需要在退出之前进行清理工作。我被教导要总是回到你的来电者那里。

今天你知道你是如何被调用的时候,你不知道将来有关代码所执行的有用任务是否会被其他程序重用,也许还会以其他方式重用不可思议的。

答案 1 :(得分:1)

首先,没有“没有使用链接堆栈的程序”,否则你的PR指令会导致异常(异常终止)。

此外,来自IBM运营原则:

  

如果当前条目的向后堆栈条目有效位(位63)   如果为零,则识别出堆栈空异常,并且操作为   无效;

这表明不仅存在链接堆栈,而且其上至少有一个帧,否则您的PR指令将因堆栈空条件而失败。

在不使用标准链接的情况下终止程序并返回到您传递的R14地址的“标准”方式是发出SVC 3指令(SVC 3为“EXIT”...终止当前RB)。实际上,如果你仔细观察,你会发现你在进入作业步骤程序时传递的R14返回地址只是指向CVTEXIT,一个SVC 3指令,所以这正是你在做什么时所做的在程序结束时做BR 14(或其他) - 没有理由你不能自己发布SVC 3。

将它拼凑在一起,听起来就像z / OS附加程序时,它会传递一个带有PSW指向SVC 3指令的帧的链接堆栈。当您在更改堆栈之前发出PR之前,您间接地将一个长分支带到此SVC 3指令并且程序结束。

您可以自己验证 - 在程序入口处转储,并查看格式化的链接堆栈。如果您不知道如何执行此操作,只需在入口点创建一个带有DC F'0'的单行汇编程序,并分批运行它并分配// SYSMDUMP DD语句(SYSMDUMP =机器可读转储)。然后你可以使用IPCS以交互方式查看转储并找出所有这些东西(这本身就是一项有价值的技能!)。