汇编(六)JCC指令

前言

初学汇编的最后一篇。

后顾一下之前提到的修改EIP的方法,分为JMP、CALL和RET。

JCC指令也可以对EIP进行修改,在学习JCC指令之前,先了解一下标志寄存器。

标志寄存器

6Jxnat.png

1、CF (bit 0)[Carry flag]

​ (1)、 若算数操作产生的结果在最高有效位发生进位或错位则将其置1,反之清零。

​ (2)、通常用来指示无符号整形运算的溢出状态。

操作演示:

2、PF(bit 2)[Parity flag]

​ (1)如果结果的最低有效字节包含偶数个1位则该位置1,否则清零。

​ (2)PF可以用来奇偶校验检查:

需要传输“11001110”数据中包含5个“1”,所以其奇校验位为"0",同时将该数据传输给接受方,接收方收到数据后再一次奇偶校验,如果仍含有五个“1”接收方奇校验位也置为“0”,与发送方一致,表明传输过程没有出现错误。

操作演示:

3、AF(bit 4)[Auxiliary Carry Flag]

如果算数操作在结果的第3位发生进位或借位则将该标志置1,否则清0。

这个标志在BCD(binary-code decimal)算数运算中被使用。

4、ZF(bit 6)[Zero flag]

(1)若结果为0则将其置1,反之清零。

(2)经常与CMP或者TEST等指令一起使用;

实例一:判断两个值是否相等

MOV EAX,100

MOV ECX,100
SUB EAX,ECX          //SUB有个弊端,会覆盖EAX中的值    
CMP EAX,ECX          //CMP指令相当于SUB指令,但是相减的结果并不保存在					  //第一个操作数中

实例二:判断某个值是否为0

AND EAX,EAX          //和上面一样,也会改变原来的值and与运算,将自己              		 //与自己与运算,如果结果为1,这说明为0

TEST EAX,EAX         //等价于AND,但结果不会保存在第一个操作数中

ZF位会经常见到,一定要理解透彻。

5、SF(bit 7)[Sign flag]

​ 该标志被设置为有符号整型的最高有效位。0则结果为正,1为负。

实例:

MOV AL,0x7F

ADD AL,2

MOV AL,0xFE

ADD AL,2

看不懂的,需要再回头看一看有符号位和无符号位的相关知识。

6、OF(bit 11)[Overflow flag]

​ 溢出标志OF用于反应有符号数加减运算结果是否溢出。

​ 如果是无符号数运算,是否溢出看CF位;

​ 如果是有符号数运算,是否溢出看OF位。

JCC指令

JCC指条件跳转指令,CC就是指条件码。

JCC指令中文含义英文原意检查符号位典型C应用
JZ/JE若为0则跳转;若相等则跳转jump if zero;jump if equalZF=1if (i == j);if (i == 0);
JNZ/JNE若不为0则跳转;若不相等则跳转jump if not zero;jump if not equalZF=0if (i != j);if (i != 0);
JS若为负则跳转jump if signSF=1if (i < 0);
JNS若为正则跳转jump if not signSF=0if (i > 0);
JP/JPE若1出现次数为偶数则跳转jump if Parity (Even)PF=1(null)
JNP/JPO若1出现次数为奇数则跳转jump if not parity (odd)PF=0(null)
JO若溢出则跳转jump if overflowOF=1(null)
JNO若无溢出则跳转jump if not overflowOF=0(null)
JC/JB/JNAE若进位则跳转;若低于则跳转;若不高于等于则跳转jump if carry;jump if below;jump if not above equalCF=1if (i < j);
JNC/JNB/JAE若无进位则跳转;若不低于则跳转;若高于等于则跳转;jump if not carry;jump if not below;jump if above equalCF=0if (i >= j);
JBE/JNA若低于等于则跳转;若不高于则跳转jump if below equal;jump if not aboveZF=1或CF=1if (i <= j);
JNBE/JA若不低于等于则跳转;若高于则跳转jump if not below equal;jump if aboveZF=0或CF=0if (i > j);
JL/JNGE若小于则跳转;若不大于等于则跳转jump if less;jump if not greater equalSF != OFif (si < sj);
JNL/JGE若不小于则跳转;若大于等于则跳转;jump if not less;jump if greater equalSF = OFif (si >= sj);
JLE/JNG若小于等于则跳转;若不大于则跳转jump if less equal;jump if not greaterZF != OF 或 ZF=1if (si <= sj);
JNLE/JG若不小于等于则跳转;若大于则跳转jump if not less equal;jump if greaterSF=0F 且 ZF=0if(si>sj)

这些指令不需要死记硬背,用到的时候查一下,用多了自然就记住了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值