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

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


CMP eax, 0(true)
CMP eax, 0(false)


评论

您可以从DuckDuckGo(或Google(或Bing))的第一个结果中获取该信息。你尝试过吗?

是的,我做到了。 (谷歌)。发现了很多内容,哪些内容可以阅读,但CMP设置的内容却不完全。

CMP基于它执行的SUB的中间结果来设置所有标志。在这里阅读:godevtool.com/GoasmHelp/usflags.htm

(CMP EAX,EDX;如果eax = edx,则设置零标志。)因此,只有零标志,并且如果为true,则为0。false。

首先阅读cmp文档:比较是通过从第一个操作数中减去第二个操作数,然后以与SUB指令相同的方式设置状态标志来进行的。但这不是检查寄存器是否为零的好方法

#1 楼

此外,使用CMP指令,目标操作数不变。只是标志。

让我举例说明。假设EAX = 00000005EBX = 00000005。如果我们执行此算术运算:

CMP EAX, EBX

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

EAX - EBX ---->
00000005 - 00000005

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

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



#2 楼

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

因此,由SUB设置的所有标志也由CMP设置。 ,SFZFAF已设置。

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