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 彙編器· 偽指令 |
| 指令擴充套件 | 浮點 · 高階語言 |
| 此頁面或部分內容是未開發的草稿或提綱。 您可以幫助開發工作,或者您可以在專案室中尋求幫助。 |