В синтаксисе 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
, который, вероятно, более понятен в этом случае).