Проблема условного перемещения - PullRequest
0 голосов
/ 02 сентября 2010

Фрагмент кода из упражнения по сборке (GNU Assembler, Linux 32 bit)


.data

more:
.asciz "more\n"

.text
...

movl $more, %eax        # this is compiled
cmova more, %eax        # this is compiled
cmova $more, %eax       # this is not compiled

Ошибка: суффикс или операнды недопустимы для `cmova '

Я могу поместить строковый адрес в% eax, используя movl, но cmova не компилируется. Мне нужно, чтобы исходный операнд был больше, а не больше, чтобы использовать его для печати. Наконец, это значение отправляется в регистр% ecx системного вызова Linux 4 (запись).

1 Ответ

3 голосов
/ 03 сентября 2010

Ассемблер правильный! Команды CMOV cc более ограничены, чем MOV: они могут перемещать только 16/32/64-битные значения из памяти в регистр или из одного регистра в другой. Они не поддерживают немедленные (или 8-битный регистр) операнды.

(Ссылка: http://www.intel.com/Assets/PDF/manual/253666.pdf - из набора руководств, доступных на http://www.intel.com/products/processor/manuals/index.htm.)

...