第二十课_JCC汇编指令

第二十课_JCC汇编指令本文详细介绍了汇编语言中的条件跳转指令 JCC 包括 JE JZ JNE JNZ 等 16 种指令 讲解了它们的工作原理和应用场景

大家好,欢迎来到IT知识分享网。

前言

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

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

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

CMP指令

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

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

测试:

sub eax,eax

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

第二十课_JCC汇编指令

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

第二十课_JCC汇编指令

cmp eax,eax

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

第二十课_JCC汇编指令

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

第二十课_JCC汇编指令

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.

第二十课_JCC汇编指令

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

第二十课_JCC汇编指令

修改ZF位为1.

第二十课_JCC汇编指令

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

第二十课_JCC汇编指令

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

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

第二十课_JCC汇编指令

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/123107.html

(0)
上一篇 2025-10-11 17:00
下一篇 2025-10-11 17:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信