Какова семантика testb $ 1,% al - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь понять, что будет делать эта инструкция testb (x86-64).

testb $1, %al

Какое значение здесь составляет $ 1. это все единицы (0xFF) или единица 1 (0x1)?

Сборка производится clang для следующей программы:

#include <atomic>
std::atomic<bool> flag_atomic{false};

extern void f1();
extern void f2();

void foo() {
    bool b = flag_atomic.load(std::memory_order_relaxed);
    if (b == false) {
        f1();
    } else {
        f2();
    }   
}

Соответствующая сборка с (clang ++ -s test.cpp -O3) выглядит следующим образом:

Lcfi2:
  .cfi_def_cfa_register %rbp
  movb  _flag_atomic(%rip), %al 
  testb $1, %al ; <<<<------------
  jne LBB0_2

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

0x начинается с шестнадцатеричного числа. 0 начинается с префикса Octal, и если вы не упомянули префикс, это будет десятичная система счисления. В вашем случае это 1 в десятичной системе счисления.

0 голосов
/ 02 мая 2018

В синтаксисе AT & T $ - префикс для непосредственных значений ( см. Также ); $1 - это простая 1, поэтому ваша инструкция устанавливает флаги в соответствии с младшим значащим битом al.

это все единицы (0xFF) или единица 1 (0x1)?

Все будут

testb $-1, %al

или (точно такой же машинный код, просто предпочтение разборки)

testb $0xff, %al

который, кстати, имел бы точно такую ​​же семантику, что и

testb %al, %al

(так как маска 0xff над 8-битным регистром ничего не маскирует), и в этом случае также подходит для вашего кода, так как для логического значения не должно быть необходимости маскировать что-либо, чтобы проверить, это правда (и действительно, gcc предпочитает эту последнюю версию для вашего кода).


movb  _flag_atomic(%rip), %al 
testb $1, %al
jne LBB0_2

в синтаксисе Intel (без префиксов, без суффиксов, dest, source порядок операндов, синтаксис явной адресации памяти) это

mov al, [rip+_flag_atomic]
test al, 1
jne LBB0_2

И, в псевдо-C:

%al = _flag_atomic;
if(%al & 1 != 0) goto LBB0_2;

(jne - псевдоним jnz, который, вероятно, более понятен в этом случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...