跳轉至內容

360 彙編/360 指令/BC

來自 Wikibooks,開放世界的開放書籍

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

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

[編輯 | 編輯原始碼]
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
華夏公益教科書