360 彙編/360 指令/BCR
BCR — 按條件暫存器分支 — 操作碼 07 / 十進位制 7 — 2 位元組 RR 指令。
格式
[編輯原始碼]- BCR mask_value,branch_register (兩個值均為 0 到 15)
- BCR 6,1
| RR 指令 (2 位元組) | |||
| 位元組 1 位 (0-7) |
位元組 2 | ||
|
掩碼值 (8-11) |
分支暫存器 (12-15) | ||
| (以十六進位制) | 操作碼 07 |
(4 位) 0..F / (十進位制 0..15) |
(4 位) 0..F / (十進位制 0..15) |
- 第一個引數是與條件程式碼比較的掩碼。
- 第二個引數是源暫存器,如果掩碼與當前設定的條件程式碼匹配,則使用其內容作為要轉移到的位置。
- 掩碼值和基暫存器值範圍為 0 到 15。
可用性
[編輯原始碼]BCR 指令在所有型號上都可用,包括 360、370 和 z/System。
此指令提供三種類型的分支操作:無分支(相當於無操作)、根據掩碼值條件分支和無條件分支。
BCR 0,0 No branch
注意:由於可能難以理解掩碼和暫存器值之間的區別,為了區分掩碼值和暫存器,暫存器將使用標籤 R 以及暫存器號來引用,例如 R5 代表暫存器 5,R6 代表暫存器 6,R14 代表暫存器 14 等等。
BCR 2,R5
BHR R6 - Special opcode: Branch if High Register, same as BCR 2,R6
BCR 1,R1
BOR R1 - Same as BC 1,R1
BCR 15,R10
BR R10 - BR opcode is unconditional branch
and is same as BCR 15,R10
BCR 3,R6
- 如果掩碼或基暫存器為零,則指令為無操作,不分支。
- 如果掩碼為 15,則分支為無條件的(除非基暫存器為 0,在這種情況下它不會分支)。因此,在以下任一情況下
BCR X,0 BCR 0,X
其中 X 是 0 到 15 之間的任何值,分支都不會被執行。
執行執行算術、測試或比較的指令後,處理器將在PSW 暫存器中設定“條件程式碼”標誌(位 18 和 19),從而允許檢查條件程式碼以進行潛在的分支。例如,假設我們正在使用一個算術指令,例如稱為 "AR" 的算術加法。然後,在以下條件下,“條件程式碼”的值將如下所示
| 條件 | 符號 | PSW 中的條件程式碼 |
|---|---|---|
| 結果為零 | Z | 0 |
| 結果為負 | N | 1 |
| 結果為正 | P | 2 |
| 結果溢位 | O | 3 |
然後,考慮例如指令“BNZR”。它的掩碼是 7。這意味著什麼?如果結果不為零,則此指令會分支,這意味著如果條件程式碼的值不為零,則會分支。所以它是 1、2 或 3。考慮下表
| Z | N | P | O |
|---|---|---|---|
| 0 | 1 | 1 | 1 |
上面的示例為我們提供了掩碼 (0111) = 7。對於以下每個操作碼,您可以構建表 ZNPO 並找到相應的掩碼。
彙編器在幾個可選操作碼中提供掩碼。這些操作碼只需基暫存器,其中包含要分支到的目標地址。操作碼如下所示
| 操作碼 | 掩碼 | 用法 | 目的 | 等效於 | 在...之後使用 |
|---|---|---|---|---|---|
| NOPR | 0 | NOPR R6 | 無操作 | BCR 0,R6 | 在任何需要無操作/填充的地方。暫存器中包含的值會被忽略。 |
| BOR | 1 | BOR R6 | 按溢位/全一分支 | BCR 1,R6 | 在算術運算或算術比較之後,如果發生算術溢位或結果為全一 |
| BHR | 2 | BHR R6 | 分支 (a 高) | BCR 2,R6 | 在任何比較之後,如果比較中的第一個值高於第二個值 (A > B),則分支 |
| BPR | 2 | BPR R6 | 按正數分支 | BC 2,R6 | 在算術運算或算術比較之後,如果結果為正,則分支 |
| BLR | 4 | BLR R6 | 分支 (a 低) | BCR 4,R6 | 在任何比較之後,如果第一個值低於第二個 (A < B),則分支 |
| BMR | 4 | BMR R6 | 按負數/混合分支 | BCR 4,R6 | 在算術運算或算術比較之後,如果結果為負數或為全一和全零,則分支 |
| BNER | 7 | BNER R6 | 分支不等於 | BCR 7,R6 | 在任何比較之後,如果第一個值不等於第二個值 (A <> B 或 A ~= B 或 A != B),則分支 |
| BNZR | 7 | BNZR R6 | 分支不為零 | BCR 7,R6 | 在算術運算或算術比較之後,如果結果不為零,則分支 |
| BER | 8 | BER R6 | 分支 (a 等於 b) | BCR 8,R6 | 在任何比較之後,如果第一個值等於第二個值 (A = B 或 A == B),則分支 |
| BZR | 8 | BZR R6 | 按零分支 | BCR 8,R6 | 在算術運算或算術比較之後,如果結果為零,則分支 |
| BNLR | 11 | BNLR R6 | 分支 (a 不低) | BCR 11,R6 | 在任何比較之後,如果第一個值不低於第二個值 (A >= B),則分支 |
| BNMR | 11 | BNMR R6 | 分支不為負數 | BCR 11,R6 | 在算術運算或算術比較之後,如果結果為零,則分支 |
| BNHR | 13 | BNHR R6 | 分支不為高 | BCR 13,R6 | 在任何比較之後,如果第一個值不高於第二個值 {A<=B),則分支 |
| BNPR | 13 | BNPR R6 | 分支不為正數 | BCR 13,R6 | 在算術運算或算術比較之後,如果結果不為正數,則分支 |
| BNOR | 14 | BNOR R6 | 分支不為全一 | BCR 14,R6 | 在算術運算或算術比較之後,如果結果不為全一,則分支 |
| BR | 15 | BR R6 | 分支 (無條件) | BCR 15,R6 | 在所有情況下都分支(除非索引暫存器為 0;否則視為無操作)等效於高階語言中的 GOTO |
07FE BR 14 unconditional branch - equivalent to BCR 15,14
0705 NOP 5 no-operation - BCR 0,5
07F0 BCR 15,0 despite the mask being 15, because the base register is 0,
* this is also a no-op
0785 BER 5 branch if a equal b - BCR 8,5 0725 BHR 5 branch if a high - BCR 2,5 0745 BLR 5 branch if a low - BCR 4,5 0775 BNER 5 branch if a not equal b - BCR 7,5 07D5 BNHR 5 branch if a not high - BCR 13,5 0745 BNLR 5 branch if a not low - BCR 4,5
0715 BOR 5 branch on overflow - BCR 1,label 0727 BPR 7 branch on plus - BCR 2,7 0745 BMR 5 branch on minus - BCR 4,5 0785 BZR 5 branch on zero - BCR 8,5 07E5 BNOR 5 branch on not ones - BCR 14,5 07D5 BNPR 5 branch on not plus - BCR 13,5 07B5 BNMR 5 branch on not minus - BCR 11,5 0775 BNZR 5 branch on not zero - BCR 7,5
4717 BOR 7 branch on ones - BCR 1,7 474F BMR 15 branch on mixed - BCR 4,15 478E BZ 14 branch on zeroes - BCR 8,14 47E5 BNO 5 branch on not ones - BCR 14,5
BCR 指令在所有型號的 360、370 和 z/System 上都可用。
執行算術運算或比較後,程式狀態字中稱為條件碼的某些位將被置位或清除。在比較兩個欄位的情況下,左值被視為“A”值,右值被視為“B”值,比較 A 與 B 的結果測試 A 與 B 如何比較,無論是低、高、相等還是不相等。
在算術運算的情況下,測試結果為正、負、零或是否已溢位。
在掩碼指令下的測試情況下,測試結果為全 1、全 0 或混合 1 和 0。
無條件分支(BCR 15,base_register)等同於高階語言中從過程或函式返回到呼叫過程或程式的 return 語句或其他退出。
根據條件暫存器分支 指令在執行此類測試後使用,以將條件程式碼位與掩碼值進行比較。如果掩碼中設定的位與條件程式碼中設定的位匹配(或掩碼中的所有位都設定),並且目標地址的基址暫存器不為 0,則包含在基址暫存器中的目標地址將被放入 PSW 中作為當前指令的新地址,並執行分支。否則,執行將繼續執行分支在條件暫存器指令後的下一條指令。
通常,根據條件暫存器分支 指令最常用於模組到模組的轉移或從一個 CSECT 分支到另一個。在同一個模組或 CSECT 內使用條件分支的情況下,根據條件分支 (BC) 指令(或可選格式 BE、BNE 等)更常使用。
根據條件暫存器分支 指令用於在程式中分支。它有三種變體:不分支或無操作、根據測試條件分支或無條件分支。
不分支 - BCR 0 - 或 NOPR 通常用於建立不繫結到現有指令的標籤。宏可以使用它進行對齊,以將指令或資料強制到特定邊界,但如果分支到該指令,則不會導致程式異常。它還可以用於提供“間隙”空間,以允許稍後修補二進位制檔案,而無需重新彙編程式。無論掩碼值如何,如果分支的基址暫存器為零,也會發生 NOPR。
在條件分支中,掩碼中的位與條件程式碼中的位進行比較。如果掩碼中的位與條件程式碼中的位匹配(並且目標地址的基址暫存器不為零),則執行分支。
透過設定掩碼中的所有位,例如 BCR 15,或使用 BR 指令,執行到另一個位置的分支(等同於高階語言中的 GOTO 或如果在過程或子例程中,則為 RETURN)。只要基址暫存器不為零,分支就會始終執行;如果基址暫存器為零,分支永遠不會執行。
根據條件暫存器分支 和可選格式通常在執行比較或算術運算後使用。在以下程式碼中,會提出一個問題,響應與是或否進行比較,如果兩者都不是,則重新發布該問題。'CALL' 宏用於建立標準子例程連結。在此示例中,內部處理否響應(在標籤 NO 處),而是響應將控制權轉移到另一個例程(稱為 YES)
CHECKINQ NOP 0(0)
* Optionally, the instruction 'CHECKINQ EQU *' could have been used. This would have
* generated no instructions.
BALR 3,0 Come back here if neither Y nor N
* optionally, the instruction LA 3,CHECKINQ could have been used. :
USING *,3 Let Assembler ue R3 for local addresses
L 4,YESRTN Place to go for Yes response
LA 5,NO Place to go for No response
CALL INQUIRE,(QUES,1,RESP) Call an external module called INQUIRE
CLC RESP(1),QY1 Compare one byte for 'Y'
BER 4 "Resp" is the A value in an A:B comparison
CLC RESP(1),QY2 Now test (length 1) for 'y'
BER 4
CLC RESP(L'QN1),QN1 Test 'N' (L' tells the assembler to use
* the specied length of the named label)
BER 5 Answer was 'N'
CLC RESP(1),QN2 Is it 'n'?
BNER 3 Something else, try again
BR 5 Answer was 'n'
QUES DC C'Are you ready to start?' Construct a 'C' language-type
DC X'00' string, zero terminated
RESP DS C One byte response
QY1 DC C'Y' Available responses
QY2 DC C'y'
QN1 DC C'N'
QN2 DC C'n'
YESRTN DC V(YES) External module YES
*
* This will handle a 'no' answer
==Typical Usage==
根據條件暫存器分支 和可選格式通常在執行比較或算術運算後使用。在以下程式碼中,會提出一個問題,響應與是或否進行比較,如果兩者都不是,則重新發布該問題。'CALL' 宏用於建立標準子例程連結。在此示例中,內部處理否響應(在標籤 NO 處),而是響應將控制權轉移到另一個例程(稱為 YES)
CHECKINQ NOP 0(0)
* Optionally, the instruction 'CHECKINQ EQU *' could have been used. This would have
* generated no instructions.
BALR 3,0 Come back here if neither Y nor N
* optionally, the instruction LA 3,CHECKINQ could have been used. :
USING *,3 Let Assembler ue R3 for local addresses
L 4,YESRTN Place to go for Yes response
LA 5,NO Place to go for No response
CALL INQUIRE,(QUES,1,RESP) Call an external module called INQUIRE
CLC RESP(1),QY1 Compare one byte for 'Y'
BER 4 "Resp" is the A value in an A:B comparison
CLC RESP(1),QY2 Now test (length 1) for 'y'
BER 4
CLC RESP(L'QN1),QN1 Test 'N' (L' tells the assembler to use
* the specied length of
BER 5 Answer was 'N'
CLC RESP(1),QN2 Is it 'n'?
BNER 3 Something else, try again
BR 5 Answer was 'n'
QUES DC C'Are you ready to start?' Construct a 'C' language-type
DC X'00' string, zero terminated
RESP DS C One byte response
QY1 DC C'Y' Available responses
QY2 DC C'y'
QN1 DC C'N'
QN2 DC C'n'
YESRTN DC V(YES) External module YES
*
* This will handle a 'no' answer
DROP 3 Tell assembler Reg. 3 is no
* longer available for addressing
NO NOP 0(0) Handle a no
- 包含在基址暫存器中的目標地址不能為奇數,否則會發生操作異常
- 包含在基址暫存器中的目標地址必須在有效記憶體範圍內,否則會發生操作異常。
- 包含在基址暫存器中的目標地址的儲存金鑰必須與當前程序相同(或該程序的金鑰必須為 0),否則會發生記憶體保護衝突異常。
- BALR 指令用於分支到暫存器中的地址並將當前地址儲存為返回地址,類似於高階語言中的過程或函式呼叫
- BC 指令以與 BCR 指令相同的方式使用,但用於分支到包含在暫存器中的地址加上潛在的索引暫存器和 12 位位移,而不是包含在暫存器中的地址。
- BCT 和 BCTR 指令用於遞減第一個引數(暫存器)中的值,將結果儲存回該暫存器,然後分支到暫存器中的地址(對於 BCTR 指令)或分支到包含在暫存器中的地址加上潛在的索引暫存器和 12 位位移,如果第一個引數暫存器中的結果值不為零。
- BRC 指令以與 BCR 指令相同的方式使用,但用於分支到相對於當前程式計數器的地址,該地址包含在立即值(16 位)中。
- BRCL 指令以與 BCR 指令相同的方式使用,但用於分支到相對於當前程式計數器的地址,該地址包含在立即值(32 位)中。
| 上一條指令 BC |
360 彙編指令 | 下一條指令 BCT |
| 上一條操作碼 06 |
下一條操作碼 08 |
| 360 組合語言 | |
| 360 系列 | 簡介 · 基本常見問題解答 · 360 系列 · 360 架構 |
|---|---|
| 360 指令集 | 360 指令 · 分支指令 · 資料傳輸指令 · 控制流指令 · 算術指令 · 邏輯指令 · 移位和旋轉指令 · 特權指令 · 其他指令 |
| 語法和彙編器 | 360 彙編器· 偽指令 |
| 指令擴充套件 | 浮點 · 高階語言 |
| 此頁面或部分內容是未開發的草稿或提綱。 你可以幫助開發這項工作,或者你可以在專案室尋求幫助。 |