[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 7. 无符号比较分支 (BCC, BHI, BLS, BCS)
注意:本文经过原作者授权转译,转载请标明出处
原文地址: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