x86 条件转移指令窥探

条件转移指令(参考

JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 “0” 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 “1” 时转移.

注意,比如 JB 是小于转移,那么 JNB 就是 NOT JB,自然就算大于等于转移了。其他类似,不再说明。

===================================================================

EFLAGS状态寄存器(参考1

参考2
EFLAGS:存放CPU的两类标志。

状态标志:反映处理器当前的状态,如有无溢出,有无进位等。

控制标志:用来控制处理器的工作方式,如是否响应可屏蔽中断等。

各状态标识的含义如下。

1、 OF:溢出标志。OF=1表示两个有符号数的运算结果超出了可以表示的范围,结果是错误的;OF=0表示没有溢出,结果正确。进行无符号数运算时也会产生新的OF标志(CPU不知道处理对象是否为有符号数),此时程序员可以不关心OF标志。

2、DF:方向标志。DF=0时,每次执行字符串指令后,源或目的地址指针用加法自动地修改地址;DF=1时用减法修改地址。它用来控制地址的方向变化。

3、IF:中断允许标志。IF=1表示允许处理器响应可屏蔽中断请求信号,成为开中断,IF=0表示不允许处理器响应可屏蔽中断请求信号,称为关中断。

4、SF:符号标志。SF=1表示运算结果的最高位为1。对于有符号数,有溢出标志OF=0时,SF=1表示运算结果为负,SF=0表示运算结果非负(正或零)。OF=1时,由于结果是错误的,所以符号位也和正确值相反。例如,两个负数相加产生溢出,此时SF=0。对于无符号数运算,SF无意义,但是可以看出结果的大小规模。

5、ZF:零标志。ZF=1表示运算结果为零,减法运算为零意味着两个参加运算的数大小相等;ZF=0,表示运算结果非零。

6、AF:辅助进位标志。它是另个BCD数运算时第三位数上的进位,供运算会调整结果用,对其他数的运算没有意义。

7、PF:奇偶标志。PF=1表示运算结果的低八位中有偶数个1;PF=0表示奇数个1,它可以用来进行奇偶校验。

8、CF:进位/借位标志。CF=1表示两个无符号数的加法有进位,或者是减法运算有借位,需要对它们的高位进行处理;CF=0表示没有产生进位或借位。同样,进行有符号数运算时也会产生新的CF标志,此时程序员可以不关心CF标志。

状态标志在每次运算后自动产生,控制标志的值则由指令设置。

另外,还有一个单步标志TF(或叫陷阱标志),用于程序的调试。TF=1时,每次执行一条指令都会产生一次陷阱,改程序被暂停,TF=0时,不产生陷阱。

还有2位表示I/0操作特权级别的标志。

1 JLE 小于等于转移

代码:

int Test()
{
	int aa = 100;
	if (aa > 100)
	{
		return 1;
	}

	return 2;
}

汇编代码:
在这里插入图片描述
可以看到,首先一句 cmp dword ptr [aa], 64h
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
因此,知道这里是做了一个减法。
根据代码逻辑 aa > 100 顺序执行,反之 aa - 100 <= 0,直接执行 return 2。
可以看到 jle 指令后面的 0E738F8h 对应的就是 return 2 的汇编代码处。
JLE/JNG 小于或等于转移.
JLE 也正是小于等于转移指令。
因此,这句 JLE 就是说,如果减法的结果是 小于等于,则跳转到 0E738F8h

2 JL 小于转移

修改下代码,直接看汇编吧:
在这里插入图片描述
aa >= 100 顺序执行,即 < 就跳转到某处。恰好是
JL 0E438F8h

3 JGE 大于等于转移

不需要分析了,一目了然
在这里插入图片描述

4 JG 大于转移

在这里插入图片描述

以上四条都是针对带符号的!

=======================================================================

5.1 JNE 不相等转移

在这里插入图片描述

5.2 JE 相等转移

在这里插入图片描述
在这里插入图片描述

6 JBE 小于等于转移

在这里插入图片描述

7 JB 小于转移

在这里插入图片描述

8 JAE 大于等于转移

图略

9 JA 大于转移

图略

以上四条是针对无符号的

========================================================================

10 JS JNS

JS 符号位为 “1” 时转移.
JNS 符号位为 “0” 时转移.

SF:符号标志。SF=1表示运算结果的最高位为1。对于有符号数,有溢出标志OF=0时,SF=1表示运算结果为负,SF=0表示运算结果非负(正或零)。OF=1时,由于结果是错误的,所以符号位也和正确值相反。例如,两个负数相加产生溢出,此时SF=0。对于无符号数运算,SF无意义,但是可以看出结果的大小规模。

在这里插入图片描述
看图,条件是 a + 1 >= 0,也就是 < 0 (负数)会跳转到 0C238FAh。
注意上面说明:
SF:对于有符号数,有溢出标志OF=0时,SF=1表示运算结果为负,SF=0表示运算结果非负(正或零)。
因此 JS 的含义就是 SF 位1, 也就是有符号数运算结果位负。与上面分析符合

在这里插入图片描述
同样分析:
SF:符号标志。SF=1表示运算结果的最高位为1。对于有符号数,有溢出标志OF=0时,SF=1表示运算结果为负,SF=0表示运算结果非负(正或零)
JNS 就是 SF = 0,表示有符号运算结果为非负。
显然这里如果 aa + 1 >= 0 就是非负,应该跳转到 0FF38FAh。

最后举一个有 if else 的情况看看:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章