Я пытаюсь нажать на стек значение one less than %ecx
.push 1 меньше% ecx to stack
Так что я попробовал эту команду для этого:
pushl $(%ecx - 1)
Однако я получаю ошибку ниже от as
.
fact.s: Assembler messages:
fact.s:49: Error: register value used as expression
В качестве обходного пути я сделал следующее:
movl %ecx, %edx
subl $1, %edx
pushl %edx
Но есть ли способ сделать это без использования дополнительных регистров (%edx
в данном случае)? И в одной инструкции?
архитектура x86 не является особенно эффективным, гибким, или ортогональны. Другие процессоры упростят выполнение некоторых из этих ограничений, но не все из них. Некоторые соглашения о программировании для процессоров с большим количеством регистров имеют тенденцию резервировать регистр, чтобы всегда держать константу 1 (один) для оптимизации этого типа операции. (Мне нравится [CDC Cyber] (https://en.wikipedia.org/wiki/CDC_Cyber). – wallyk
Если вы можете использовать дополнительный рег, более короткое обходное решение - 'lea -1 (% ecx),% edx/push% edx'. В противном случае вы должны иметь значение, полностью вычисленное в регистре, в качестве ввода других инструкций. Непосредственными значениями должны быть константы времени сборки (именно поэтому вы получаете эту ошибку от ассемблера). –