跳轉到內容

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。

此指令的操作因地址模式而異。

24 位操作

[編輯 | 編輯來源]

在 64 位機器上,目標暫存器載入如下:位 0 到 31 保持不變;位 32-39 包含來自當前 PSW 的指令長度程式碼、條件碼和程式掩碼位;位 33 到 63 載入下一條指令(緊隨此指令之後)的地址。如果源暫存器不為 0,則源暫存器的位 33-63 載入到 PSW 中,作為新的下一條指令地址。

在 24 位或 31 位機器上,或者在 24 位模式下操作時,目標暫存器載入如下:位 0 到 7 包含來自當前 PSW 的指令長度程式碼、條件碼和程式掩碼位;位 8 到 31 載入下一條指令(緊隨此指令之後)的地址。如果源暫存器不為 0,則源暫存器的位 8-31 載入到 PSW 中,作為新的下一條指令地址。

31 位操作

[編輯 | 編輯來源]

在 64 位機器上,目標暫存器載入如下:位 0 到 31 保持不變;位 32 設定為 1;位 33 到 63 載入下一條指令(緊隨此指令之後)的地址。如果源暫存器不為 0,則源暫存器的位 33-63 載入到 PSW 中,作為新的下一條指令地址。

在 31 位機器上,或者在 31 位模式下操作時,目標暫存器載入如下:位 0 設定為 1;位 2 到 31 載入下一條指令(緊隨此指令之後)的地址。如果源暫存器不為 0,則源暫存器的位 2-31 載入到 PSW 中,作為新的下一條指令地址。

64 位操作

[編輯 | 編輯來源]

下一條指令的地址載入到目標暫存器的位 0-64 中。

源暫存器為零

[編輯 | 編輯來源]

對於第一個示例,建立基址暫存器,格式為
BALR R5,R0
當前 PC(程式計數器)的值加上 2(此指令的大小)載入到目標暫存器中(在本例中為 R5)。執行從下一條指令開始繼續,不發生分支。

源暫存器不為零

[編輯 | 編輯來源]

對於第二個示例,呼叫外部例程,格式為
BALR R5,R3
它將在 R5 中儲存 BALR 指令後的下一條順序地址,並跳轉到 R3 中儲存的地址。R3 必須在發出此指令之前使用以下方法預先載入外部例程的地址:

  • 一個 LALAY 指令
  • 在 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 彙編器· 偽指令
指令擴充套件 浮點數 · 高階語言
華夏公益教科書