第二十课_JCC汇编指令

前言

写到这篇文章真不容易了,连续好几篇汇编语言的文章,都是些基础的东西,写起来难受,虽然本id是软工的,但是汇编只能说是自学来的,很多东西都是半调子,写起来吃力些是正常的。今天这文章可能是最后一篇单纯写汇编指令的文章了,(以后肯定要扯到汇编,但是不会像这几篇文章那样单纯只写汇编指令怎么用)。

今天讲JCC指令(条件跳转指令),这个也是相当重要,学了这个,C语言中的ifelseswitch等语句就能很好理解其底层的实现了。会涉及到前面讲的数据宽度、有符号无符号、标志寄存器等知识。

在正式说JCC前,先说几个汇编指令,这样有助于理解JCC

CMP指令

指令格式:CMP r/m,r/m/imm

说明:CMP指令是比较两个数。本质上,它相当于sub指令,但是它不把相减的结果保存到第一个操作数中。只是根据相减的结果来改变零标志位(ZF),即两操作数相等的时候,零标志位为1.

测试:

sub eax,eax

执行前的eax中的值,和标志寄存器中的值,为了让大家更好地看出运行的结果,双击ZF位,修改为0.

相减后,标志寄存器中是这样的。

cmp eax,eax

用mov指令修改eax中的值,当然也可以双击eax中的值,在弹出的对话框中修改eax中的值。

然后执行cmp指令,标志寄存器中是这样的,对比sub指令,发现它们改变的位是一样的。

TEST指令

指令格式:TEST r/m,r/m/imm

说明:该指令跟CMP指令相似,运算结果只改变相应的标志寄存器的位,不把值保存到第一个操作数中。不过TEST指令的运算是“与”操作。TEST指令通常用于确定某个寄存器是否等于0。例如:test ecxecx。指令这条指令只有ecx中的值为0时,标志寄存器ZF位才能为0,因为两个相同的数时行与运算,只有这两个数都为0时,结果才为0.

 

通过上面两个指令的接触,我们可以认识到,在汇编中,有些指令可以进行一些运算,运算的结果只改变标志寄存器,但是没有保存运算的结果。而JCC就是根据标志寄存器进行跳转的,JCC只认知标志寄存器。

JCC有很多指令,格式是:指令名 跳转的地址。下面是逐个进行讲解,文末也有一个整理的图。

JCC指令

1、JEJZ指令

说明:JE(jump if zero)、JZ(jump if equal),从英文中也可以看出,这两个指令在运行的结果为零(相等)时,就跳转到指令后面的地址。这两个指令,只看ZF位,如果ZF位为1,就进行跳转。

测试:

在OD中只认识JE,你输入JZOD会自动转成JE的,说明在OD眼中,它俩就是一个东西。先测试ZF位是0时,看程序是否进行了跳转。我们在跳转到的地址处下一个断点,然后修改ZF位为0.

运行的结果如下图,可以看到当ZF位为0时,不进行跳转。

修改ZF位为1.

运行的结果如下图,可以看到:当ZF位为1时,程序进行了跳转。

下面的指令就不一一进行测试演示了。

2、JNEJNZ指令

JNE(jump if not equal)、JNZ(jump if not zero),结果不为0时跳转,即ZF = 0时跳转。

3、JS指令

JS(jump if sign),结果为负数时跳转,即SF = 1时跳转。

4、JNS指令

JNS(jump if not sign),结果不为负数时跳转,即SF = 0时跳转。

5、JPJPE指令

JP(jump if Parity )、JPE(jump if Parity Even),结果中1的个数为偶数时跳转,即PF = 1时跳转。

6、JNPJPO指令

JNP(jump if not parity)、JPO(jump if not parity odd),结果中1的个数不为偶数时跳转,即PF = 0时跳转。

7、JO指令

JO(jump if overflow),结果溢出时跳转,即OF = 1时跳转。

8、JNO指令

JNO(jump if not overflow),结果没有溢出时跳转,即OF = 0时跳转。

9、JBJNAE指令

JB(jump if below),JNAE(jump if not above equal),无符号(再次说明:到底是有符号,还是无符号,是程序员说了算,计算机根本不管你是有符号还是无符号)中,小于则跳转,即CF = 1时跳转。如果对逻辑不是很清晰的,很容易搞混这些大于小于的问题,不过慢慢想总能想明白的。

10、JNBJAE指令

JNB(jump if not below),JAE(jump if above equal),无符号数中,大于等于时跳转,即CF = 0时跳转。

11、JBEJNA指令

JBE(jump if below equal),JNA(jump if not above),无符号数中,小于等于时则跳转,即CF = 1 or ZF = 1时跳转。

12、JNBEJA指令

JNBE(jump if not below equal),JA(jump if above),无符号数中,大于则跳转,即CF = 0 and ZF = 0时跳转。

13、JLJNGE指令

JL(jump if less),JNGE(jump if not greater equal ),有符号数中,小于则跳转,即SF = OF时跳转。

14、JNLJGE指令

JNL(jump if not less),JGE(jump if not greater equal).有符号数中,大于等于时跳转,即SF = OF

15、JLEJNG指令

JLE(jump if less equal),JNG(jump if not greater),有符号数中,小于等于跳转,ZF = 1 or SF = OF

16、JNLEJG指令

JNLE(jump if not less equal),JG(jump if greater),有符号数中,大于时跳转,即ZF = 0 and SF = OF时跳转。

 

不能理解的,记住也行,不写了,要睡觉了,期待早上起来能收到快递。

写于2020.6.21 0:46

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值