assembly x86 asm中NOT指令简单示例

insrf1ej  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(173)

有人能解释一下x86汇编程序中的NOT指令到底是做什么的吗?
在我所知道的编程语言中,NOT用于检查特定状态是否为真(例如:if (!Isset($var))) .
但在汇编语言中,操作符似乎做了其他事情,我不明白操作数到底是做什么的。
有人能用一个简单的例子来解释一下这个操作吗?

gupuwyp2

gupuwyp21#

x86 NOT是逐位运算;它只是单独反转每个位,如xor reg, -1,但不影响FLAGS。

NOT实现了C's ~ operator,与!logical not)完全不同。

下面是C编译器如何实现这些操作符(gcc8.1和clang6.0用于x86-64 System V调用约定,在Godbolt编译器资源管理器上)。两个编译器生成相同的代码,正确地选择了最有效的现代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

相关问题