本文主要是介绍汇编(六)JCC指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 标志寄存器
- 1、CF (bit 0)[Carry flag]
- 2、PF(bit 2)[Parity flag]
- 3、AF(bit 4)[Auxiliary Carry Flag]
- 4、ZF(bit 6)[Zero flag]
- 实例二:判断某个值是否为0
- 5、SF(bit 7)[Sign flag]
- 6、OF(bit 11)[Overflow flag]
- JCC指令
前言
初学汇编的最后一篇。
后顾一下之前提到的修改EIP的方法,分为JMP、CALL和RET。
JCC指令也可以对EIP进行修改,在学习JCC指令之前,先了解一下标志寄存器。
标志寄存器
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,100MOV ECX,100
SUB EAX,ECX //SUB有个弊端,会覆盖EAX中的值
CMP EAX,ECX //CMP指令相当于SUB指令,但是相减的结果并不保存在 //第一个操作数中
实例二:判断某个值是否为0
AND EAX,EAX //和上面一样,也会改变原来的值and与运算,将自己 //与自己与运算,如果结果为1,这说明为0TEST EAX,EAX //等价于AND,但结果不会保存在第一个操作数中
ZF位会经常见到,一定要理解透彻。
5、SF(bit 7)[Sign flag]
该标志被设置为有符号整型的最高有效位。0则结果为正,1为负。
实例:
MOV AL,0x7FADD AL,2MOV AL,0xFEADD AL,2
看不懂的,需要再回头看一看有符号位和无符号位的相关知识。
6、OF(bit 11)[Overflow flag]
溢出标志OF用于反应有符号数加减运算结果是否溢出。
如果是无符号数运算,是否溢出看CF位;
如果是有符号数运算,是否溢出看OF位。
JCC指令
JCC指条件跳转指令,CC就是指条件码。
JCC指令 | 中文含义 | 英文原意 | 检查符号位 | 典型C应用 |
---|---|---|---|---|
JZ/JE | 若为0则跳转;若相等则跳转 | jump if zero;jump if equal | ZF=1 | if (i == j);if (i == 0); |
JNZ/JNE | 若不为0则跳转;若不相等则跳转 | jump if not zero;jump if not equal | ZF=0 | if (i != j);if (i != 0); |
JS | 若为负则跳转 | jump if sign | SF=1 | if (i < 0); |
JNS | 若为正则跳转 | jump if not sign | SF=0 | if (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 overflow | OF=1 | (null) |
JNO | 若无溢出则跳转 | jump if not overflow | OF=0 | (null) |
JC/JB/JNAE | 若进位则跳转;若低于则跳转;若不高于等于则跳转 | jump if carry;jump if below;jump if not above equal | CF=1 | if (i < j); |
JNC/JNB/JAE | 若无进位则跳转;若不低于则跳转;若高于等于则跳转; | jump if not carry;jump if not below;jump if above equal | CF=0 | if (i >= j); |
JBE/JNA | 若低于等于则跳转;若不高于则跳转 | jump if below equal;jump if not above | ZF=1或CF=1 | if (i <= j); |
JNBE/JA | 若不低于等于则跳转;若高于则跳转 | jump if not below equal;jump if above | ZF=0或CF=0 | if (i > j); |
JL/JNGE | 若小于则跳转;若不大于等于则跳转 | jump if less;jump if not greater equal | SF != OF | if (si < sj); |
JNL/JGE | 若不小于则跳转;若大于等于则跳转; | jump if not less;jump if greater equal | SF = OF | if (si >= sj); |
JLE/JNG | 若小于等于则跳转;若不大于则跳转 | jump if less equal;jump if not greater | ZF != OF 或 ZF=1 | if (si <= sj); |
JNLE/JG | 若不小于等于则跳转;若大于则跳转 | jump if not less equal;jump if greater | SF=0F 且 ZF=0 | if(si>sj) |
这些指令不需要死记硬背,用到的时候查一下,用多了自然就记住了。
这篇关于汇编(六)JCC指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!