注意:本文经过原作者授权转译,转载请标明出处
原文地址:http://mrjester.hapisan.com/04_MC68/Sect06Part05/Index.html
条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正
译文:
"物极必反" ---- 莎士比亚
简介
这两个条件分支指令会根据V
状态标志的内容来做分支。
注意:这些分支指令只有两种长度可以使用,
.s
表示短整型
而.w
表示字
,具体可回看第五章第三节(BRA
指令)的内容
BVC 指令
BVC (Branch on oVerflow Clear) - 无溢出时分支
如果CCR
里的V
状态标志是0
的话,目的操作数
会被加到PC
里,然后 m68k 会从PC
里的新的地址处继续执行,如果V
状态标志是1
的话,这条指令就会被忽略
例子
这是一个基于结果是不是溢出的例子:
cmpi.w #$0020, d0
bvc.s FlagVIsClear
move.w #$0000, d0
FlagVIsClear:
我们假设d0
在指令执行前的内容是2400801E
,CMP
指令使用的长度是字
,所以只有801E
会被用来计算。801E
- 0020
= 7FFE
,因为我们是在用一个负数去减去一个正数,所以结果应当是个负数,但是由于有符号数的表示范围问题,结果却是个正数 (溢出了表示范围),所以V
状态标志会被设置为1
,然后 m68k 不会跳转到 "FlagNIsClear
"
- 假如
V
状态标志被设置为1
,那么分支跳转就会被忽略 - 假如
V
状态标志被清除为0
,那么 m68k 就会去分支跳转到对应的标记
BVS 指令
BVS (Branch on oVerflow Set) - 溢出时分支
如果CCR
里的V
状态标志是1
的话,目的操作数
会被加到PC
里,然后 m68k 会从PC
里的新的地址处继续执行,如果V
状态标志是0
的话,这条指令就会被忽略
例子
这是与BVC
恰恰相反的例子:
cmpi.w #$0020, d0
bvs.s FlagVIsSet
move.w #$0000, d0
FlagVIsSet:
我们假设d0
在指令执行前的内容是2400801E
,CMP
指令使用的长度是字
,所以只有801E
会被用来计算。801E
- 0020
= 7FFE
,因为我们是在用一个负数去减去一个正数,所以结果应当是个负数,但是由于有符号数的表示范围问题,结果却是个正数 (溢出了表示范围),所以V
状态标志会被设置为1
,然后 m68k 会跳转到 "FlagNIsClear
"继续执行
- 假如
V
状态标志被设置为1
,那么 m68k 就会去分支跳转到对应的标记 - 假如
V
状态标志被清除为0
,那么分支跳转就会被忽略
目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 4. BPL & BMI (正负条件分支) 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 6. 有符号比较分支 (BGE, BGT, BLE, BLT)