注意:本文經過原作者授權轉譯,轉載請標明出處
原文地址:http://mrjester.hapisan.com/04_MC68/Sect06Part07/Index.html
條件允許建議閱讀原文,網上非中文資料還是較多,當作鍛煉英文豈不美哉
翻譯若有不足之處歡迎批評指正
譯文:
"如果你想要提攜我,那你得站的比我高才行" ---- 拉爾夫 瓦爾多 愛默生 (Ralph Waldo Emerson, 1803-1882),美國思想家、文學家,詩人
簡介
這些分支指令會在某個數值大於或是小於一個特定的值的時候去分支跳轉。它們只和無符號數打交道,也就是說如果使用的是字節長度的話,00是最小值,而FF是最大值
所以如果我們比較FE和02的話,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的內容是00009800,CMP指令使用的長度是字,所以會在0020與9800之間比較
9800大於0020,所以 m68k 會跳轉到Is20orHigher處繼續執行
如果我們假設d0的內容是0000001F,CMP指令使用的長度是字,所以會在0020與001F之間比較
001F並不大於等於0020,所以指令會被忽略
你也可以使用助記符
BHS(Branch on Higher than or Same, 大於或相同時分支) 來代替BCC,它們的效果是一樣的,BHS比BCC更容易根據它的具體意思來讓人記住,匯編程序會自動的把BHS轉換成BCC
BHI 指令
BHI (Branch on HIghter than) - 大於 (>) 時分支
如果C和Z的內容都是0的話,目的操作數會被加到PC里,然后 m68k 會在PC里的新的地址處繼續執行,否則,這條指令會被忽略
例子
這條指令通過C和Z兩個狀態標志一起來檢測計算結果是不是大於 (>):
cmpi.w #$0020, d0
bhi.s IsHigher
move.w #$0000, d0
IsHigher:
我們假定d0的內容是00000020,CMP指令使用的長度是字,所以會在0020與0020之間比較
0020等於0020,所以指令會被忽略
如果我們假設d0的內容是0000F492,CMP指令使用的長度是字,所以會在0020與F492之間比較
F492大於0020,所以 m68k 會跳轉到IsHigher處繼續執行
BLS 指令
BLS (Branch on Less than or Same) - 小於等於 (≤) 時分支
如果C和Z的內容都是1的話,目的操作數會被加到PC里,然后 m68k 會在PC里的新的地址處繼續執行,否則,這條指令會被忽略
例子
這條指令和BCC (BHS) 恰恰相反:
cmpi.w #$0020, d0
bls.s Is20orLower
move.w #$0000, d0
Is20orLower:
我們假定d0的內容是00009800,CMP指令使用的長度是字,所以會在0020與9800之間比較
9800並不小於等於0020,所以指令會被忽略
如果我們假設d0的內容是00000001,CMP指令使用的長度是字,所以會在0020與0001之間比較
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的內容是00000020,CMP指令使用的長度是字,所以會在0020與0020之間比較
0020等於0020,所以指令會被忽略
如果我們假設d0的內容是00000004,CMP指令使用的長度是字,所以會在0020與0004之間比較
0004小於0020,所以 m68k 會跳轉到IsLower處繼續執行
你也可以使用助記符
BLO(Branch on LOwer, 大於或相同時分支) 來代替BCS,它們的效果是一樣的,BLO比BCS更容易根據它的具體意思來讓人記住,匯編程序會自動的把BLO轉換成BCS
BHS 和 BLO
BHS和BLO是分別對應於BCC和BCS的一對助記符,值得注意的是,BHS和BCC是同一個指令,BLO和BCS也是同一個指令,只是名字不同而已
家庭作業
又到了這個有趣的時刻,你大概已經清楚了分支,條件分支還有跳轉的這些指令,現在有一串指令它們使用了最近兩章學習的指令,讓我們來康康吧:
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
