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 彙編器· 偽指令 |
| 指令擴充套件 | 浮點數 · 高階語言 |