街机模拟游戏逆向工程(HACKROM)教程:[16]68K汇编-条件分支指令

发布时间:2024年01月22日

在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,所以第三个逻辑不成立。
但是只要有一个逻辑成立,就会发生跳转,这里,因为第二个逻辑已经成立,所以,这里会发生跳转

条件分支指令在以后的逆向研究中十分重要,建议花一定的时间去测试和理解这一部份。
?

文章来源:https://blog.csdn.net/m0_50114967/article/details/135488074
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。