360 汇编/360 指令/LA
LA - 加载地址 - 操作码 41 - RX 格式指令 (32 位)
- LA 2,N2
- LA 11,106(8,10)
具体语法为
- LA 目标寄存器,偏移量(索引寄存器,基址寄存器)
如果使用标签而不是显式索引和基址寄存器以及偏移量,则如果已使用 USING 伪指令,并且目标地址标签在某个基址寄存器的值 4095 字节内,则汇编程序将自动确定偏移量、索引寄存器和基址寄存器的值。
RX 指令 (4 字节) | ||||||
字节 1 | 字节 2 | 字节 3 和 4 | ||||
目标寄存器 | 源地址 | |||||
(8 位) 操作码 41 |
(4 位) 0..F |
(4 位) 索引 寄存器 0..F |
(4 位) 基址 寄存器 0..F |
(12 位) 偏移量 0..FFF |
- 第一个参数是目标寄存器,其值受指令影响。
- 第二个参数是要解析的地址。
- 基址寄存器和索引寄存器的值为 0 到 15。偏移量值为 0 到 4095。如果基址寄存器或索引寄存器或两者都被指定为 0,则该寄存器的值被假定为包含 0。
- 在 31 位模式下,位 0 始终被此指令清除。在 24 位模式下;位 1-7 也被清除。
LA 指令在所有型号的 360、370 和 z/System 上可用。
此指令不改变条件码。
LA 指令有三种一般用途。
- 将寄存器设置为 0 到 4095 的立即值(使用寄存器 0 作为基址和索引寄存器,并将要添加的量作为位移)。
- 将 1 到 4095 的立即值添加到除 0 之外的任何寄存器,可以使用寄存器 0 作为索引寄存器,并将同一个寄存器用于基址和目标寄存器,或者使用寄存器 0 作为基址寄存器,并将同一个寄存器用于索引和目标寄存器,并将要添加到该寄存器的量作为位移。
- 将寄存器设置为 31 位或 64 位模式下的 2^31 以内的任何值,或 24 位模式下的 2^24 以内的任何值。使用包含所需量的任何寄存器作为基址(或索引)寄存器,如果有要添加的额外数量,可以使用索引(或基址)寄存器中的值,并且,如果需要,也可以通过位移地址增加它。
- 如果位移为 0,并且(1)基址寄存器为 0,并且索引和目标寄存器相同(并且是除 0 之外的任何寄存器),或者(2)索引寄存器为 0,并且基址和目标寄存器相同(并且是除 0 之外的任何寄存器),则该指令实际上是一个无操作指令(相当于将 0 添加到指定寄存器的指令)。
- 如果位移地址、基址和索引寄存器都为零,则它会将目标寄存器清零(尽管使用两个参数都相同的 XR 或 SR 指令会更快,并且使用更少的内存)。
注意,与大多数指令不同,LA 指令用于将值放入寄存器中;结果地址不必对应实际地址,也不检查其有效性。不会发生溢出,因为结果的最高位始终设置为 0,并且在 24 位模式下,结果的最高 7 位设置为 0。
LA 指令可以通过将基址、索引和位移值设置为 0 来清除寄存器的值;寄存器 0 中的实际值不会使用,并且寄存器将被清零。但是,SR 或 XR 指令(两个参数具有相同的寄存器号)将更快地清零寄存器,并且会生成更短的指令。
LA 指令根据第二个参数指定的地址计算 31 位值(如果程序在 31 位或 64 位地址模式下运行)或 24 位值,并将其存储在第一个参数指定的寄存器中,清除 31 位或 64 位模式下的最高位(0),以及 24 位模式下的最高字节(位 0-7)。该地址通过使用地址的基址位移值来计算。地址值(从 0 到 4095)被添加到基址寄存器内容的值(除非它是寄存器 0,则被假定包含零)。在这个值上,加上索引寄存器内容的值(除非它是寄存器 0,则也被假定包含零)。在 31 位或 64 位模式下,最高位被强制为 0。在 24 位模式下,最高字节被强制为 0。然后将此总计存储在目标寄存器中。此值不必是有效地址;虽然 LA 指令通常用于计算地址,但它可以用于设置寄存器的值,例如,递增寄存器 1 的一种方法如下
- LA 1, 1(0,1)
或者递增寄存器 7 的 5
- LA 7, 5(0,7)
在某些情况下,(24 位和 31 位模式)LA 指令用于为大于 4095 字节的程序段创建寻址,方法是安排第二个寄存器指向第一个寄存器后的 4096 字节
ROUTINE CSECT BALR 12,0 USING *,12,11 LA 11,4095(0,12) Register 0 explicitly stated as the index register LA 11,1(11) Register 0 is implied for the Index register
在上述情况下,寄存器 12 是例程前 4096 字节的基址寄存器,而寄存器 11 是程序大于 4096 字节的部分的基址寄存器。
没有。生成的地址不检查其有效性,并且因为在所有模式(24 位、31 位或 64 位)下,位 0 始终被清除,所以不会发生溢出。
最密切相关的指令
[编辑源代码]最密切相关的指令是逻辑寄存器加法 (ALR),而不是加载地址 (LA),正如有时假设的那样。虽然 L 从内存中加载值,但 LA 不访问内存;它只计算一个数字,该数字可以是地址,但不一定是地址。
32 位指令
[编辑源代码]- 要从内存中加载 8 位字节(字符)值,请参阅 IC。
- 要根据掩码将一个或多个 8 位字节值加载到寄存器中,请参阅 ICM
- 要从内存中加载 16 位半字值,请参阅 LH。
- 要将一个 12 位无符号值加载到寄存器中,或将最多 4095 加到一个或两个 32 位寄存器的值中,请参见 LA。
- 要将一个 32 位字值从一个寄存器复制到另一个寄存器,请参见 LR。
- 要将一个 32 位字值从内存中加载,请参见 L。
- 要将一个 8 位字节(字符)值存储到内存中,请参见 STC。
- 要根据掩码将一个或多个 8 位字节值存储到内存中,请参见 STCM
- 要将一个 16 位半字值存储到内存中,请参见 STH。
- 要将一个 32 位字值存储到内存中,请参见 ST。
64 位指令
[编辑源代码]- 要将一个 20 位有符号值从扩展的(20 位)有符号内存偏移加载到一个 32 位或 64 位寄存器中,请参见 LAY。
- 要将一个 32 位值从扩展的(20 位)有符号内存偏移加载到一个 64 位寄存器中,请参见 LGF。
- 要将一个 64 位值从一个 64 位寄存器复制到另一个 64 位寄存器,请参见 LGR。
- 要将一个 64 位值从内存加载到一个 64 位寄存器中,请参见 LG。
- 要将一个 32 位值从寄存器存储到扩展的(20 位)有符号内存偏移,请参见 STY。
- 要将一个 64 位值从一个 64 位寄存器存储到内存中的地址,请参见 STG。
上一条指令 L |
360 汇编指令 | 下一条指令 LAE |
上一个操作码 40 |
下一个操作码 42 |
360 汇编语言 | |
360 系列 | 简介 · 基本常见问题 · 360 系列 · 360 架构 |
---|---|
360 指令集 | 360 指令 · 分支指令 · 数据传输指令 · 控制流指令 · 算术指令 · 逻辑指令 · 移位和旋转指令 · 特权指令 · 其他指令 |
语法和汇编器 | 360 汇编器· 伪指令 |
指令扩展 | 浮点 · 高级语言 |
此页面或部分内容是未开发的草稿或提纲。 您可以帮助开发工作,或者您可以在项目室中寻求帮助。 |