В синтаксисе AT & T (который вы используете) инструкции имеют суффикс размера для указания размера операнда.Суффиксы размера:
b byte 1 bytes
w word 2 bytes
l long 4 bytes
q quad-word 8 bytes
s single 4 bytes
d double 8 bytes
t temporary 10 bytes
Например, cmpb
- это инструкция cmp
с указанным размером 1-байтового операнда.Тем не менее, ваш код использует %rdi
в качестве операнда, который является регистром из четырех слов (64 бита), поэтому ассемблер справедливо жалуется, что это неправильный операнд.
Чтобы исправить эту проблему, просто пропуститесуффикс размера;ассемблер может сделать вывод, если все операнды не являются непосредственными операндами или операндами памяти:
cmp %rdi, $0
Конечно, вы также можете явно указать суффикс размера;в этом случае q
подходит, как указано в предыдущей таблице:
cmpq %rdi, $0
При этом обратите внимание, что, как и в большинстве инструкций, непосредственный операнд должен быть первым операндом для cmpq
:
cmpq $0, %rdi
Другая форма на самом деле незаконна.