NASM CMP 和 OR 的区别

NASM Difference between CMP and OR

我有 2 个问题。第一个:'or'和'cmp'有什么区别?这两个我都见过,看起来他们做同样的事情。我的第二个问题:什么是

or al, al

是什么意思?它不应该一直 return 真吗(比如 x == x)?

实际上,汇编并不像return true那么简单。一般来说,条件执行通常是基于一个状态寄存器。我将在本说明中使用 Intel x86 架构。请注意,其他架构有所不同,但据我所知,基本原理仍然存在。

如前所述,程序的流程由状态寄存器决定,在 x86 上名为 FLAGS (http://en.wikipedia.org/wiki/FLAGS_register)。如您所见,例如有 ZF(零标志)位。如果执行 jzjnz 等条件指令,则检查 ZF 并根据此状态执行(或不执行)跳转。

FLAGS 寄存器随着代码的执行而更新,每条指令将一些(有时 none)位设置为适当的值。可以在给定体系结构的相应手册中阅读此数据。例如,在 x86 上,add 指令改变 CF(进位标志)。

如果您查找 or 指令,它会像这样更新 FLAGS:“清除 OF 和 CF 标志;根据结果设置 SF、ZF 和 PF 标志。 “ (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf#G5.251049).

因此,

or al, al

代码的功能基于后面的任何条件指令。它单独存在没有意义,因为 x |= x(在类 C 语言中)基本上对值没有影响,但对状态寄存器有副作用。

根据我们可以阅读的内容,我们可以使用

or al, al
jnz _someWhere

为了判断al寄存器的内容是否为非零,如果是,则跳转到_someWhere

为了解释使用 test al, al 而不是 cmp al, 0or al,al 的原因(所有这些都设置相同的 FLAGS),我建议阅读 Peter Cordes 在