2015-11-14 5 views
2

Я пытаюсь нажать на стек значение 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 в данном случае)? И в одной инструкции?

+1

архитектура x86 не является особенно эффективным, гибким, или ортогональны. Другие процессоры упростят выполнение некоторых из этих ограничений, но не все из них. Некоторые соглашения о программировании для процессоров с большим количеством регистров имеют тенденцию резервировать регистр, чтобы всегда держать константу 1 (один) для оптимизации этого типа операции. (Мне нравится [CDC Cyber] (https://en.wikipedia.org/wiki/CDC_Cyber). – wallyk

+2

Если вы можете использовать дополнительный рег, более короткое обходное решение - 'lea -1 (% ecx),% edx/push% edx'. В противном случае вы должны иметь значение, полностью вычисленное в регистре, в качестве ввода других инструкций. Непосредственными значениями должны быть константы времени сборки (именно поэтому вы получаете эту ошибку от ассемблера). –

ответ

5

Без дополнительных регистров? Конечно. Декабре/толчок/вкл. Одна инструкция? No.

decl %ecx 
pushl %ecx 
incl %ecx 
5

Две инструкции:

pushl %ecx 
subl $1, (%esp)  # or decl (%esp)