在M68K中,有许多条件分支指令,这些指令和无条件跳转批令不同,它们会读取标志位,按照标志位的不同状态来选择是否进行跳转,我们来看看所有的条件分支指令:
BHI 高于转移 !C&&!Z [非进/借位] 与 [非零]
BLS 低于或相同转移 C||Z [进/借位] 或 [为零]
BCC 无进/借位转移 !C [非进/借位]
BCS 有进/借位转移 C [进/借位]
BNE 不为零(不相等)转移 !Z [非零]
BEQ 为零(相等)转移 Z [为零]
BVC 无溢出转移 !V [非溢出]
BVS 有溢出转移 V [溢出]
BPL 非负数转移 !N [非负]
BMI 负数转移 N [为负]
BGE 大于等于(不小于)转移 N&&V||!N&&!V [为负] 与 [溢出] 或 [非负] 与 [非溢出]
BLT 小于转移 N&&!V||!N&&V [为负] 与 [非溢出] 或 [非负] 与 [溢出]
BGT 大于转移 N&&V&&!Z||!N&&!V&&!Z [为负] 与 [溢出] 与 [非零] 或 [非负] 与 [非溢出] 与 [非零]
BLE 小于等于(不大于)转移 Z||N&&!V||!N&&V [为零] 或 [为负] 与 [非溢出] 或 [非负] 与 [溢出]
我们可以看到,所有的条件分支指令都会读取标志位来进行不同的选择。
我们用之前已经介绍过的cmp指令来测试:
move.b #$08,d0
cmpi.b #$09,d0 有进/借位 ,无溢出 ,非0 ,为负
?我们来看看每句cmp指令对标志位产生的影响,并对应一些条件分支指令来说明条件分支指令中的逻辑:
cmpi.b #$09,d0 (d0=$08)
运算: $08 - $09
C(进位) - 进/借位 1
V(溢出) - 无溢出 0
Z(零结果) - 非零 0
N(负结果) - 为负 1
BGE的逻辑有两个
一、[为负] 与 [溢出]
或者
二、[非负] 与 [非溢出]
此时,我们看看这两个逻辑
第一个逻辑,虽然N(负结果)标志为1,但是V(溢? 出)标志为0,所以第一个逻辑不成立。
第二个罗辑,虽然V(溢? 出)标志为0,但是N(负结果)标志为1,所以第二个逻辑也不成立。
所以,在这个状态下,BGE指令不会跳转。
?我们再来看BLE的逻辑有三个
一、[为零]
或者
二、[为负] 与 [非溢出]
或者
三、[非负] 与 [溢出]
第一个逻辑,Z(零结果)标志为0,所以第一个逻辑不成立。
第二个逻辑,N(负结果)标志为1,V(溢出)标志为0,所以第二个逻辑成立。这时这时会发生跳转
第三个逻辑,N(负结果)标志为1,V(溢出)标志为0,所以第三个逻辑不成立。
但是只要有一个逻辑成立,就会发生跳转,这里,因为第二个逻辑已经成立,所以,这里会发生跳转
条件分支指令在以后的逆向研究中十分重要,建议花一定的时间去测试和理解这一部份。
?