простой пример инструкции NOT в asm x86 - PullRequest
0 голосов
/ 06 июня 2018

Может кто-нибудь объяснить, что именно делает инструкция NOT в ассемблере x86?

На известных мне языках программирования NOT используется для проверки, является ли конкретный статус неверным (например, if (!Isset($var))).

Но в Ассемблере оператор, кажется, делает что-то еще, и я не совсем понимаю, для чего предназначен этот операнд.

Может ли кто-нибудь объяснить операцию на простом примере?

1 Ответ

0 голосов
/ 07 июня 2018

x86 NOT - побитовая операция;он просто инвертирует каждый бит отдельно, как xor reg, -1, но без влияния на FLAGS.

NOT реализует ~ оператор C и полностью отличается от ! ( логически не ).

Вот как эти компиляторы C реализуют эти операторы (gcc8.1 и clang6.0 для соглашения о вызовах System V в x86-64, на Godboltпроводник компилятора ).Оба компилятора генерируют идентичный код, правильно выбирая наиболее эффективную реализацию для современных процессоров Intel / AMD.

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
...