ASM: несоответствие типа операнда для `cmp ' - PullRequest
0 голосов
/ 10 октября 2018

Я делаю код сборки x86 и получаю эту ошибку: несоответствие типов операндов для `cmp's

Строка кода, в которой он появляется:

cmpb %rdi, $0

1 Ответ

0 голосов
/ 10 октября 2018

В синтаксисе 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

Другая форма на самом деле незаконна.

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