跳轉到內容

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 <> BA ~= BA != B),則分支
BNZR 7 BNZR  R6 分支不為零 BCR   7,R6 在算術運算或算術比較之後,如果結果不為零,則分支
BER 8 BER   R6 分支 (a 等於 b) BCR   8,R6 在任何比較之後,如果第一個值等於第二個值 (A = BA == 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 

在 a 和 b 的標準比較之後使用

[編輯 | 編輯原始碼]
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 位位移,而不是包含在暫存器中的地址。
  • BCTBCTR 指令用於遞減第一個引數(暫存器)中的值,將結果儲存回該暫存器,然後分支到暫存器中的地址(對於 BCTR 指令)或分支到包含在暫存器中的地址加上潛在的索引暫存器和 12 位位移,如果第一個引數暫存器中的結果值不為零。
  • BRC 指令以與 BCR 指令相同的方式使用,但用於分支到相對於當前程式計數器的地址,該地址包含在立即值(16 位)中。
  • BRCL 指令以與 BCR 指令相同的方式使用,但用於分支到相對於當前程式計數器的地址,該地址包含在立即值(32 位)中。
上一條指令
BC
360 彙編指令   下一條指令
BCT
上一條操作碼
06
下一條操作碼
08
360 組合語言
360 系列 簡介 · 基本常見問題解答 · 360 系列 · 360 架構
360 指令集 360 指令 · 分支指令 · 資料傳輸指令 · 控制流指令 · 算術指令 · 邏輯指令 · 移位和旋轉指令 · 特權指令 · 其他指令
語法和彙編器 360 彙編器· 偽指令
指令擴充套件 浮點 · 高階語言


華夏公益教科書