有人能解释一下 x86 汇编器中的 NOT 指令到底是做什么的吗?
在我知道的编程语言中, NOT 用于检查特定状态是否不正确(例如: if (!Isset($var)))
。
但是在汇编程序中,运算符似乎在做其他事情,我不明白该操作数的确切用途。
有人可以用一个简单的例子来解释这个操作吗?
最佳答案
x86 NOT
是按位运算;它只是分别反转每一位,例如 xor reg, -1
但不影响 FLAGS。
NOT
工具C's ~
operator , 与 !
完全不同( logical not )。
以下是 C 编译器如何实现这些运算符(用于 x86-64 System V 调用约定的 gcc8.1 和 clang6.0, on the Godbolt compiler explorer )。两个编译器生成相同的代码,正确地为现代 Intel/AMD CPU 选择最有效的实现。
int bitnot(int a) { return ~a; }
mov eax, edi
not eax
ret
int logical_not(int a) { return !a; }
xor eax, eax
test edi, edi
sete al
ret
int booleanize(int a) { return !!a; }
xor eax, eax
test edi, edi
setne al
ret
关于assembly - x86 asm 中 NOT 指令的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50726304/