当我在不使用链接堆栈的程序中发出PR(程序返回)指令时,程序立即结束。我想利用这种行为,但我想知道除了退出我的程序之外是否会导致任何意想不到的结果?我已经阅读了操作手册中的PR描述,但没有看到任何回答我问题的内容。
如果PR指令不适合立即终止程序,那么我应该使用另一种方法吗?
答案 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以交互方式查看转储并找出所有这些东西(这本身就是一项有价值的技能!)。