CMP 指令如何使用条件标志?

逆向工程 部件 x86
2021-06-27 00:41:57

我试图找出 x86 指令集系列中条件跳转(JE/JNE、JZ/JNZ)的行为。

哪个条件标志CMP指令集以及如何,如果结果相等,如果不相等?例如:

  • CMP eax, 0 (真的)

  • CMP eax, 0 (错误的)

2个回答

此外,使用 CMP 指令,目标操作数不会改变。只是旗帜。

让我举例说明。让我们说EAX = 00000005EBX = 00000005如果我们做这个算术运算:

CMP EAX, EBX

发生了什么,实际上是这样的:

EAX - EBX ----> 00000005 - 00000005

由于结果是0,但我们不会更改 CMP 指令中的目标操作数,因此零标志设置为1(因为它为真)。

因此,正如我们所见,根据前面算术运算的结果,可以相应地设置标志:

在此处输入图片说明

CMP指令在内部执行 aSUB并相应地设置标志。

所以所有由 a 设置的标志SUB也由CMP.

即标志SF, ZF, AF, PF, 和CF被设置。

此信息取自处理器的英特尔手册 ( https://software.intel.com/en-us/articles/intel-sdm )。