360 汇编/360 指令/BALR
BALR — 分支并链接寄存器 — 操作码 05 / 十进制 05 — 2 字节 RR 指令。
格式
[编辑来源]- BALR 目标寄存器,源寄存器 (两个寄存器值均为 0 到 15)
- BALR 6,1
RR 指令(2 字节) | |||
字节 1 位 (0-7) |
字节 2 | ||
目标寄存器 (8-11) |
源寄存器 (12-15) | ||
(十六进制) | 操作码 05 |
(4 位) 0..F / (十进制 0..15) |
(4 位) 0..F / (十进制 0..15) |
- 第一个参数是目标寄存器,其值受指令影响。
- 第二个参数是源寄存器。
- 目标寄存器 和 源寄存器 的值是 0 到 15。
可用性
[编辑来源]BALR 指令在所有型号上均可用,包括 360、370 和 z/System。
BALR 是分支并链接寄存器指令,用于在 24 位、31 位或 64 位模式下运行的代码之间进行转移。它将下一条顺序指令的地址存储到目标寄存器中,然后跳转到源寄存器中指定的地址,除非指定了寄存器 0,在这种情况下不进行分支。此指令保留用于与 360 机器兼容;对于 370 及更高版本,BASR 指令是首选。
它在两种情况下使用。首先,建立一个基址寄存器来寻址正在执行的当前模块中的位置。其次,它用于调用外部例程,保存返回地址。请注意,当在示例中使用寄存器时,标签 R0、R1,一直到 R15 用于分别表示值 0 或 1 到 15。
此指令的操作因地址模式而异。
在 64 位机器上,目标寄存器加载如下:位 0 到 31 保持不变;位 32-39 包含来自当前 PSW 的指令长度代码、条件码和程序掩码位;位 33 到 63 加载下一条指令(紧随此指令之后)的地址。如果源寄存器不为 0,则源寄存器的位 33-63 加载到 PSW 中,作为新的下一条指令地址。
在 24 位或 31 位机器上,或者在 24 位模式下操作时,目标寄存器加载如下:位 0 到 7 包含来自当前 PSW 的指令长度代码、条件码和程序掩码位;位 8 到 31 加载下一条指令(紧随此指令之后)的地址。如果源寄存器不为 0,则源寄存器的位 8-31 加载到 PSW 中,作为新的下一条指令地址。
在 64 位机器上,目标寄存器加载如下:位 0 到 31 保持不变;位 32 设置为 1;位 33 到 63 加载下一条指令(紧随此指令之后)的地址。如果源寄存器不为 0,则源寄存器的位 33-63 加载到 PSW 中,作为新的下一条指令地址。
在 31 位机器上,或者在 31 位模式下操作时,目标寄存器加载如下:位 0 设置为 1;位 2 到 31 加载下一条指令(紧随此指令之后)的地址。如果源寄存器不为 0,则源寄存器的位 2-31 加载到 PSW 中,作为新的下一条指令地址。
下一条指令的地址加载到目标寄存器的位 0-64 中。
对于第一个示例,建立基址寄存器,格式为
BALR R5,R0
当前 PC(程序计数器)的值加上 2(此指令的大小)加载到目标寄存器中(在本例中为 R5)。执行从下一条指令开始继续,不发生分支。
对于第二个示例,调用外部例程,格式为
BALR R5,R3
它将在 R5 中存储 BALR 指令后的下一条顺序地址,并跳转到 R3 中存储的地址。R3 必须在发出此指令之前使用以下方法预先加载外部例程的地址:
- 一个 LA 或 LAY 指令
- 在 24 位或 32 位模式下,使用 A 常量的 L 指令,如果外部例程是此模块的本地例程,或者使用包含外部符号的 V 常量,如果外部例程位于另一个模块中,或者
- 在 64 位模式下,使用 AD 常量的 LG 指令。
虽然 BALR 指令可用于任何类型的子程序调用,无论是内部的还是外部的,但当与非零源寄存器一起使用时,它主要用于调用外部例程。IBM、Unisys 和富士通操作系统上的标准约定一直是将寄存器 14 用作目标寄存器,并将寄存器 15 预先加载为要调用的外部例程的地址。此外,(在 24 位和 32 位应用程序中)寄存器 13 用于包含调用例程提供的 72 字节存储区域,以允许被调用例程保存寄存器 14 和 0 到 12。
通常,对于内部子程序(在同一个模块中),BAL 指令是首选。
BALR 指令没有错误,但是
- 分支寄存器中包含的目标地址不能是奇数,否则会发生操作异常。
- 分支寄存器中包含的目标地址必须在有效内存范围内,否则会发生操作异常。
- 目标地址的存储键必须与当前进程相同(或该进程的键为 0),否则会发生内存保护冲突异常。
另请参阅
[edit | edit source]- BAL - 通常用于调用内部子程序的类似指令
- BASR - 370 或 390 机器上用于外部子程序的另一种分支指令
- BAS - 类似于 BASR 的另一种内部子程序调用
- BSM - 用于在将模式从 24 位更改为 31 位或从 31 位更改为 24 位时进行分支
- BASSM - 用于在将模式从 24 位更改为 31 位或从 31 位更改为 24 位时进行分支
上一条指令 BAL |
360 汇编指令 | 下一条指令 BAS |
上一条操作码 04 |
下一条操作码 06 |
360 汇编语言 | |
360 系列 | 简介 · 基本常见问题解答 · 360 系列 · 360 架构 |
---|---|
360 指令集 | 360 指令 · 分支指令 · 数据传输指令 · 控制流指令 · 算术指令 · 逻辑指令 · 移位和旋转指令 · 特权指令 · 其他指令 |
语法和汇编器 | 360 汇编器· 伪指令 |
指令扩展 | 浮点数 · 高级语言 |