x86 asm 中 NOT 指令的简单示例

问题描述 投票:0回答:1

有人能解释一下 x86 汇编程序中的 NOT 指令到底做了什么吗?

在我知道的编程语言中,NOT 用于检查特定状态是否为真(例如:

if (!Isset($var)))
.

但是在Assembler中,操作符好像在做别的事情,我不明白操作数到底是干什么用的

有人可以用一个简单的例子来解释这个操作吗?

assembly x86 nasm bitwise-operators logical-operators
1个回答
9
投票

x86

NOT
是按位运算;它只是分别反转每一位,如
xor reg, -1
但不影响FLAGS.

NOT
实现了 C 的
~
运算符
,与
!
逻辑非)完全不同。

以下是 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
© www.soinside.com 2019 - 2024. All rights reserved.