注意:本文经过原作者授权转译,转载请标明出处
原文地址: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