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
(零标志)位。如果执行 jz
或 jnz
等条件指令,则检查 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, 0
或 or al,al
的原因(所有这些都设置相同的 FLAGS),我建议阅读 Peter Cordes 在
我有 2 个问题。第一个:'or'和'cmp'有什么区别?这两个我都见过,看起来他们做同样的事情。我的第二个问题:什么是
or al, al
是什么意思?它不应该一直 return 真吗(比如 x == x)?
实际上,汇编并不像return true
那么简单。一般来说,条件执行通常是基于一个状态寄存器。我将在本说明中使用 Intel x86 架构。请注意,其他架构有所不同,但据我所知,基本原理仍然存在。
如前所述,程序的流程由状态寄存器决定,在 x86 上名为 FLAGS
(http://en.wikipedia.org/wiki/FLAGS_register)。如您所见,例如有 ZF
(零标志)位。如果执行 jz
或 jnz
等条件指令,则检查 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, 0
或 or al,al
的原因(所有这些都设置相同的 FLAGS),我建议阅读 Peter Cordes 在