PR指令对空栈有什么影响
What are the effects of PR instruction on empty stack
当我在一个没有使用链接栈的程序中发出 PR (Program Return) 指令时,程序立即结束。我想利用这种行为,但我想知道除了退出我的程序之外,我是否会导致任何意想不到的结果?我已经阅读了 principal of operations manual 中的 PR 描述,但没有看到任何可以回答我问题的内容。
如果 PR 指令不适合立即终止程序,我应该使用其他方法吗?
通常会有入口逻辑来保存来电者登记。例外包括旨在为调用者设置寄存器值的代码。
如果你想return给你的来电者,BR
到return注册在BASR
。简单地退出整个过程并不是一个好主意,因为您不知道您是如何被调用的。也许程序 A 调用了你。也许 A 调用了 B,B 调用了 C,C 又调用了你,A、B 和 C 都需要在退出前做清理工作。我被教导总是 return 给你的来电者。
虽然今天你知道你是如何被调用的,但你不知道相关代码正在执行的有用任务将来是否会被其他程序重用,也许以一种还未曾梦想过的方式。
首先,没有"a program that is not using linkage stacks"这样的东西,否则你的PR指令会导致异常(abend)。
此外,来自 IBM 操作原则:
If the backward stack-entry validity bit, bit 63, of the current entry
is zero, a stack-empty exception is recognized, and the operation is
nullified;
这表明不仅有一个链接栈,而且上面至少有一个帧,否则你的 PR 指令将因栈为空而失败。
"standard" 在不使用标准链接的情况下终止程序并 returning 到您传递的那个 R14 地址的方法是发出 SVC 3 指令(SVC 3 是 "EXIT"...终止当前的RB)。事实上,如果你仔细观察,你会发现你在进入作业步骤程序时传递的 R14 return 地址只是指向 CVTEXIT,一条 SVC 3 指令,所以这正是你'当你在程序结束时执行 BR 14(或其他)时你正在做 - 没有理由你不能自己发布 SVC 3。
将其拼凑在一起,听起来好像 z/OS 附加您的程序时,它会向您传递一个链接堆栈,其中的帧具有指向 SVC 3 指令的 PSW。当您在任何其他更改堆栈之前发出 PR 时,您间接地对该 SVC 3 指令进行了长分支,并且您的程序结束了。
您可以自己验证这一点 - 在程序入口处进行转储,然后查看格式化的链接堆栈。如果您不知道如何执行此操作,只需在入口点创建一个带有 DC F'0' 的单行汇编程序,然后 运行 批量分配 //SYSMDUMP DD 语句(SYSMDUMP = 机器可读倾倒)。然后您可以使用 IPCS 以交互方式查看转储并找出所有这些东西(这本身就是一项有价值的技能!)。
当我在一个没有使用链接栈的程序中发出 PR (Program Return) 指令时,程序立即结束。我想利用这种行为,但我想知道除了退出我的程序之外,我是否会导致任何意想不到的结果?我已经阅读了 principal of operations manual 中的 PR 描述,但没有看到任何可以回答我问题的内容。
如果 PR 指令不适合立即终止程序,我应该使用其他方法吗?
通常会有入口逻辑来保存来电者登记。例外包括旨在为调用者设置寄存器值的代码。
如果你想return给你的来电者,BR
到return注册在BASR
。简单地退出整个过程并不是一个好主意,因为您不知道您是如何被调用的。也许程序 A 调用了你。也许 A 调用了 B,B 调用了 C,C 又调用了你,A、B 和 C 都需要在退出前做清理工作。我被教导总是 return 给你的来电者。
虽然今天你知道你是如何被调用的,但你不知道相关代码正在执行的有用任务将来是否会被其他程序重用,也许以一种还未曾梦想过的方式。
首先,没有"a program that is not using linkage stacks"这样的东西,否则你的PR指令会导致异常(abend)。
此外,来自 IBM 操作原则:
If the backward stack-entry validity bit, bit 63, of the current entry is zero, a stack-empty exception is recognized, and the operation is nullified;
这表明不仅有一个链接栈,而且上面至少有一个帧,否则你的 PR 指令将因栈为空而失败。
"standard" 在不使用标准链接的情况下终止程序并 returning 到您传递的那个 R14 地址的方法是发出 SVC 3 指令(SVC 3 是 "EXIT"...终止当前的RB)。事实上,如果你仔细观察,你会发现你在进入作业步骤程序时传递的 R14 return 地址只是指向 CVTEXIT,一条 SVC 3 指令,所以这正是你'当你在程序结束时执行 BR 14(或其他)时你正在做 - 没有理由你不能自己发布 SVC 3。
将其拼凑在一起,听起来好像 z/OS 附加您的程序时,它会向您传递一个链接堆栈,其中的帧具有指向 SVC 3 指令的 PSW。当您在任何其他更改堆栈之前发出 PR 时,您间接地对该 SVC 3 指令进行了长分支,并且您的程序结束了。
您可以自己验证这一点 - 在程序入口处进行转储,然后查看格式化的链接堆栈。如果您不知道如何执行此操作,只需在入口点创建一个带有 DC F'0' 的单行汇编程序,然后 运行 批量分配 //SYSMDUMP DD 语句(SYSMDUMP = 机器可读倾倒)。然后您可以使用 IPCS 以交互方式查看转储并找出所有这些东西(这本身就是一项有价值的技能!)。