360 彙編/360 指令/BC
BC - 條件分支 - RX 型別指令 - 操作碼 47 / 十進位制 71
BC 指令在所有型號的 360、370 和 z/System 上都可用。
- BC 2,LABEL
- BH LABEL - 特殊操作碼,與 BC 2,LABEL 相同
- BC 1,L1
- BO L1 - 與 BC 1,L1 相同
- BC 15,106(0,10)
- B 106(0,10) - B 操作碼是無條件分支,與 BC 15 相同
- BC 3,256(7,6)
具體的語法是
- BC 掩碼,偏移量(索引暫存器,基址暫存器)
如果已使用USING偽指令,並且目標地址標籤位於某個基址暫存器值的 4096 位元組內,則彙編程式將自動確定偏移量、索引暫存器和基址暫存器的值。
| RX 指令(4 位元組) | ||||||
| 位元組 1 | 位元組 2 | 位元組 3 和 4 | ||||
| 掩碼 | 目標地址 | |||||
| (8 位) 操作碼 47 |
(4 位) 0..F |
(4 位) 索引 暫存器 0..F |
(4 位) 基址 暫存器 0..F |
(12 位) 偏移量 0..FFF | ||
- 第一個引數是掩碼,條件碼將與此掩碼進行比較。
- 第二個引數是如果掩碼與當前設定的條件碼匹配則要轉移到的位置。偏移量值將新增到基址和索引暫存器中的值以形成目標地址。大多數指令用法傾向於使用一個基址暫存器和一個索引暫存器零,但如果使用兩個非零暫存器,則無論哪個暫存器是基址暫存器,哪個是索引暫存器,目標地址都將相同。
- 掩碼、基址暫存器和索引暫存器的值為 0 到 15。偏移量值為 0 到 4095。
- 如果掩碼或基址暫存器為零,則指令為無操作,不會分支。
- 如果掩碼為 15,則分支為無條件(除非基址暫存器為 0,在這種情況下它不會分支)。
- 如果指定的索引暫存器為 0,則不使用索引暫存器中的值。
執行更改條件碼的指令後,計算機將設定 PSW 中“條件碼”欄位中的 CC 標誌位。然後,如果所選條件碼與該指令中的掩碼匹配,則此指令可以分支。例如,假設我們正在使用算術加暫存器“AR”。然後在以下條件下,“條件碼”的值將如下所示
| 條件 | 符號 | PSW 中的條件碼 |
|---|---|---|
| 結果為零 | Z | 0 |
| 結果為負 | N | 1 |
| 結果為正 | P | 2 |
| 結果溢位 | O | 3 |
然後考慮指令“BNZ”(非零分支)。它的掩碼是 7。這意味著什麼?如果結果不為零,此指令將分支,這意味著如果條件碼的值不為零,它將分支!所以它是 1、2 或 3。考慮下表
| Z | N | P | O |
|---|---|---|---|
| 0 | 1 | 1 | 1 |
上面的例子給了我們掩碼 (0111) = 7。對於每個以下操作碼,您可以構造表 ZNPO 並找到相應的掩碼。
彙編程式將掩碼作為幾個可選操作碼的一部分提供。這些只需要目標地址。這些操作碼是
| 操作碼 | 掩碼 | 用法 | 目的 | 等價於 | 用法 |
|---|---|---|---|---|---|
| NOP | 0 | NOP LABEL | 無操作 | BC 0,LABEL | 任何需要無操作/填充的地方 |
| BO | 1 | BO LABEL | 溢位/一分支 | BC 1,LABEL | 算術運算或算術比較後,如果發生算術溢位或結果全為一 |
| BH | 2 | BH LABEL | 分支(高) | BC 2,LABEL | 任何比較之後,如果比較中的第一個值高於第二個值(A > B),則分支 |
| BP | 2 | BP LABEL | 正分支 | BC 2,LABEL | 算術運算或算術比較後,如果結果為正,則分支 |
| BL | 4 | BL LABEL | 分支(低) | BC 4,LABEL | 任何比較之後,如果第一個值低於第二個值(A < B),則分支 |
| BM | 4 | BM LABEL | 負/混合分支 | BC 4,LABEL | 算術運算或算術比較後,如果結果為負或為一和零,則分支 |
| BNE | 7 | BNE LABEL | 不相等分支 | BC 7,LABEL | 任何比較之後,如果第一個值不等於第二個值(A <> B 或 A ~= B 或 A != B),則分支 |
| BNZ | 7 | BNZ LABEL | 非零分支 | BC 7,LABEL | 算術運算或算術比較後,如果結果不為零,則分支 |
| BE | 8 | BE LABEL | 分支(a 等於 b) | BC 8,LABEL | 任何比較之後,如果第一個值等於第二個值(A = B 或 A == B),則分支 |
| BZ | 8 | BZ LABEL | 零分支 | BC 8,LABEL | 算術運算或算術比較後,如果結果為零,則分支 |
| BNL | 11 | BNL LABEL | 分支(a 不低) | BC 11,LABEL | 任何比較之後,如果第一個值不低於第二個值(A >= B),則分支 |
| BNM | 11 | BNM LABEL | 非負分支 | BC 11,LABEL | 算術運算或算術比較後,如果結果為零,則分支 |
| BNH | 13 | BNH LABEL | 非高分支 | BC 13,LABEL | 任何比較之後,如果第一個值不高於第二個值 {A<=B),則分支 |
| BNP | 13 | BNP LABEL | 非正分支 | BC 13,LABEL | 算術運算或算術比較後,如果結果不為正,則分支 |
| BNO | 14 | BNO LABEL | 非一分支 | BC 14,LABEL | 算術運算或算術比較後,如果結果不是全一,則分支 |
| B | 15 | B LABEL | 分支(無條件) | BC 15,LABEL | 在所有情況下分支(除非索引暫存器為 0;否則視為無操作)等價於高階語言中的 GOTO |
對於左側顯示的示例機器程式碼,假設地址LABEL位於暫存器 10 的偏移量 106(06A 十六進位制)處,並且地址 X1 假設位於基址暫存器 6 和索引暫存器 7 的和的偏移量 256(0100 十六進位制)處。
47F0A06A B LABEL unconditional branch - equivalent to BC 15,label
47076100 NOP X1 no-operation - BC 0,X1
47FC0006 BC 15,6(12,0) despite the mask being 15, because the base register is 0,
* this is also a no-op
4780A06A BE LABEL branch if a equal b - BC 8,label 4720A06A BH LABEL branch if a high - BC 2,label 4740A06A BL LABEL branch if a low - BC 4,label 47776100 BNE X1 branch if a not equal b - BC 7,X1 47D0A06A BNH LABEL branch if a not high - BC 13,label 4740A06A BNL LABEL branch if a not low - BC 4,label
4710A06A BO LABEL branch on overflow - BC 1,label 47276100 BP X1 branch on plus - BC 2,X1 4740A06A BM LABEL branch on minus - BC 4,label 4780A06A BZ LABEL branch on zero - BC 8,label 47D0A06A BNP LABEL branch on not plus - BC 13,label 47B0A06A BNM LABEL branch on not minus - BC 11,label 4770A06A BNZ LABEL branch on not zero - BC 7,label
47176100 BO X1 branch on ones - BC 1,X1 4740A06A BM LABEL branch on mixed - BC 4,label 4780A06A BZ LABEL branch on zeroes - BC 8,label 47E0A06A BNO LABEL branch on not ones - BC 14,label
執行算術運算或比較後,程式狀態字中稱為條件碼的某些位會被設定或清除。在比較兩個欄位的情況下,左側值被視為“A”值,右側值被視為“B”值,並且A與B的比較結果測試A與B的比較方式,可以是低、高、相等或不相等。
在算術運算的情況下,會測試結果是正數、負數、零還是溢位。
在掩碼測試指令的情況下,會測試結果是全1、全0還是混合的1和0。
條件分支指令用於在執行此類測試後,將條件碼位與掩碼值進行比較。如果掩碼中設定的位與條件碼中設定的位匹配(或掩碼中的所有位都被設定),並且目標地址的基本暫存器不為0,則目標地址將被置入PSW作為當前指令的新地址,並執行分支。否則,執行將繼續執行條件分支指令之後的下一條指令。
目標地址是透過將基本暫存器和索引暫存器的內容與偏移地址相加來構造的。如果索引暫存器為零,則不使用其值。
“條件分支”指令是程式中通用的分支指令。它有三種變體:無分支或無操作、根據測試進行條件分支或無條件分支。
“無分支” - BC 0 - 或“NOP”通常用於建立不與現有指令繫結的標籤。宏可以使用它進行對齊,以強制將指令或資料放到特定的邊界上,但在分支到該指令時不會導致程式異常。它還可以用於提供“空閒”空間,以便以後在不重新組裝程式的情況下進行二進位制補丁。如果分支的基本暫存器也為零,則無論掩碼值如何,也會發生NOP。
掩碼中的位與條件碼中的位進行比較。如果掩碼中的位與條件碼中的位匹配(並且目標地址的基本暫存器不為零),則執行分支。
透過設定掩碼中的所有位(例如BC 15)或使用B指令來執行到另一個位置的分支(相當於高階語言中的GOTO)。只要目標地址的基本暫存器不為零,分支將始終被執行。
條件分支和可選格式通常用於執行比較或算術運算之後。在以下程式碼中,會提出一個問題,將響應與是或否進行比較,如果都不是,則重新發出問題。“CALL”宏用於建立標準的子程式連結。
CHECKINQ NOP 0(0)
CALL INQUIRE,(QUES,1,RESP) Call an external module called INQUIRE
CLC RESP(1),QY1 Compare one byte
BE YES "Resp" is the A value in an A:B comparison
CLC RESP(1),QY2
BE YES
CLC RESP(1),QN1
BE NO Answer was 'N'
CLC RESP(1),QN2 Is it 'n'?
BNE CHECKINQ Something else, try again
B NO 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'
- 分支暫存器中包含的目標地址不能為奇數,否則會發生操作異常。
- 分支暫存器中包含的目標地址必須在有效記憶體範圍內,否則會發生操作異常。
- 目標地址的儲存金鑰必須與當前程序相同(或此程序的金鑰必須為0),否則會發生記憶體保護衝突異常。
- BALR指令用於分支到暫存器中的地址,並將當前地址儲存為返回地址,類似於高階語言中的過程或函式呼叫。
- BCR指令的使用方式與BC指令相同,但用於分支到指定的第二個引數暫存器中的地址。
- BCT指令用於從暫存器中減去1,然後如果結果不為零,則分支到指定的地址。
- BCTR指令用於從暫存器中減去1,然後如果結果不為零,則分支到第二個引數中指定的暫存器中的地址。
- BRC指令用於分支到相對於當前程式計數器的地址,該地址包含在立即數(16位)值中。
- BRCL指令用於分支到相對於當前程式計數器的地址,該地址包含在立即數(32位)值中。
| 上一條指令 BASSM |
360彙編指令 | 下一條指令 BCR |
| 上一操作碼 46 |
下一操作碼 48 |