assembly - x86 asm 中 NOT 指令的简单示例

标签 assembly x86 nasm bitwise-operators logical-operators

有人能解释一下 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/

相关文章:

C 内联汇编 Int 0x10

caching - SFENCE和LFENCE对相邻核心的缓存有什么影响?

linux - 在 x86 上发送用户模式中断

assembly - rel8 立即数操作数的 x86-64 Intel 语法?

c++ - 为什么在堆栈和堆上创建变量会产生相同的汇编代码?

linux - execve shellcode linux段错误

linux - 为什么我无法成功将变量内容压入堆栈?

performance - 在 x86 中设置和清除零标志

assembly - 运行代码时出现错误 MIPS “spim: (parser) syntax error”

linux - 需要了解基本 assembly 的指导