注意:本文經過原作者授權轉譯,轉載請標明出處
原文地址: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