[轉譯][馬基 傑斯特(MarkeyJester) 摩托羅拉68000 入門教程] 陸 - 條件分支 | 7. 無符號比較分支 (BCC, BHI, BLS, BCS)


注意:本文經過原作者授權轉譯,轉載請標明出處

原文地址:http://mrjester.hapisan.com/04_MC68/Sect06Part07/Index.html

條件允許建議閱讀原文,網上非中文資料還是較多,當作鍛煉英文豈不美哉
翻譯若有不足之處歡迎批評指正

譯文:


"如果你想要提攜我,那你得站的比我高才行" ---- 拉爾夫 瓦爾多 愛默生 (Ralph Waldo Emerson, 1803-1882),美國思想家、文學家,詩人

簡介

這些分支指令會在某個數值大於或是小於一個特定的值的時候去分支跳轉。它們只和無符號數打交道,也就是說如果使用的是字節長度的話,00是最小值,而FF是最大值

所以如果我們比較FE02的話,FE會被認為比02要大

BCC 指令

BCC (Branch on Carry Clear) - 大於等於 (≥) 時分支

如果C的內容是0的話,目的操作數會被加到PC里,然后 m68k 會在PC里的新的地址處繼續執行,否則,這條指令會被忽略

例子

這條指令通過C狀態標志是否是0來檢測計算結果是不是大於等於 (≥),有趣的是當C的內容是0的時候,計算結果總是"大於等於":

    cmpi.w     #$0020, d0
    bcc.s      Is20orHigher
    move.w     #$0000, d0

  Is20orHigher:

我們假定d0的內容是00009800CMP指令使用的長度是,所以會在00209800之間比較

  • 9800大於0020,所以 m68k 會跳轉到Is20orHigher處繼續執行

如果我們假設d0的內容是0000001FCMP指令使用的長度是,所以會在0020001F之間比較

  • 001F並不大於等於0020,所以指令會被忽略

你也可以使用助記符BHS (Branch on Higher than or Same, 大於或相同時分支) 來代替BCC,它們的效果是一樣的,BHSBCC更容易根據它的具體意思來讓人記住,匯編程序會自動的把BHS轉換成BCC

BHI 指令

BHI (Branch on HIghter than) - 大於 (>) 時分支

如果CZ的內容都是0的話,目的操作數會被加到PC里,然后 m68k 會在PC里的新的地址處繼續執行,否則,這條指令會被忽略

例子

這條指令通過CZ兩個狀態標志一起來檢測計算結果是不是大於 (>):

    cmpi.w     #$0020, d0
    bhi.s      IsHigher
    move.w     #$0000, d0

  IsHigher:

我們假定d0的內容是00000020CMP指令使用的長度是,所以會在00200020之間比較

  • 0020等於0020,所以指令會被忽略

如果我們假設d0的內容是0000F492CMP指令使用的長度是,所以會在0020F492之間比較

  • F492大於0020,所以 m68k 會跳轉到IsHigher處繼續執行

BLS 指令

BLS (Branch on Less than or Same) - 小於等於 (≤) 時分支

如果CZ的內容都是1的話,目的操作數會被加到PC里,然后 m68k 會在PC里的新的地址處繼續執行,否則,這條指令會被忽略

例子

這條指令和BCC (BHS) 恰恰相反:

    cmpi.w     #$0020, d0
    bls.s      Is20orLower
    move.w     #$0000, d0

  Is20orLower:

我們假定d0的內容是00009800CMP指令使用的長度是,所以會在00209800之間比較

  • 9800並不小於等於0020,所以指令會被忽略

如果我們假設d0的內容是00000001CMP指令使用的長度是,所以會在00200001之間比較

  • 0001小於0020,所以 m68k 會跳轉到Is20orLower處繼續執行

BCS 指令

BCS (Branch on Carry Set) - 小於 (<) 時分支

如果C狀態標志是1的話,目的操作數會被加到PC里,然后 m68k 會在PC里的新的地址處繼續執行,否則,這條指令會被忽略

例子

這條指令和BHI恰恰相反:

    cmpi.w     #$0020, d0
    bcs.s      IsLower
    move.w     #$0000, d0

  IsLower:

我們假定d0的內容是00000020CMP指令使用的長度是,所以會在00200020之間比較

  • 0020等於0020,所以指令會被忽略

如果我們假設d0的內容是00000004CMP指令使用的長度是,所以會在00200004之間比較

  • 0004小於0020,所以 m68k 會跳轉到IsLower處繼續執行

你也可以使用助記符BLO (Branch on LOwer, 大於或相同時分支) 來代替BCS,它們的效果是一樣的,BLOBCS更容易根據它的具體意思來讓人記住,匯編程序會自動的把BLO轉換成BCS

BHS 和 BLO

BHSBLO是分別對應於BCCBCS的一對助記符,值得注意的是,BHSBCC是同一個指令,BLOBCS也是同一個指令,只是名字不同而已

家庭作業

又到了這個有趣的時刻,你大概已經清楚了分支,條件分支還有跳轉的這些指令,現在有一串指令它們使用了最近兩章學習的指令,讓我們來康康吧:

    move.w     #$0010, d0
    clr.l      d1
    move.w     #$0400, d4
    clr.l      d2
    move.w     #$1000, d3

  NotReached:
    addi.b     #$10, d2
    add.w      d0, d1
    cmp.w      d1, d4
    bgt.s      NotReached
    sub.w      d2, d1
    subi.w     #$1000, d3
    bpl.s      NotReached
    move.w     d1, d0
    swap       d0
    move.w     d3, d0

那么這些指令執行完之后d0的內容會是多少呢 (這個有點復雜,也就是說你要追蹤每一個寄存器又或是跳轉很多次,不過就像他們常說的那樣,你要先學會殘忍才能懂得仁慈)

目錄
上一篇:[轉譯][馬基 傑斯特(MarkeyJester) 摩托羅拉68000 入門教程] 陸 - 條件分支 | 6. 有符號比較分支 (BGE, BGT, BLE, BLT)
下一篇:[轉譯][馬基 傑斯特(MarkeyJester) 摩托羅拉68000 入門教程] 陸 - 條件分支 | 8. 家庭作業答案 - 5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM