2015-11-14 46 views
2

我试图推入堆栈的值为one less than %ecx推1比%ecx小1

所以,我想这个指令是:

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架构没有特别高效,灵活,或正交。其他的CPU会让这些约束更容易,但不是全部。一些有许多寄存器的CPU的编程约定倾向于保留寄存器来始终保持常量1(1)以优化这种类型的操作。 (想起[CDC Cyber​​](https://en.wikipedia.org/wiki/CDC_Cyber​​)) – wallyk

+2

如果您可以使用额外的reg,较短的解决方法是'lea -1(%ecx),%edx/push%edx'。否则,您需要将寄存器中的值完全计算为其他指令的输入。立即值必须是汇编时常量(这就是为什么你从汇编程序中得到这个错误)。 –

回答

5

没有额外的寄存器?当然。 DEC /推/ INC。一条指令?号

decl %ecx 
pushl %ecx 
incl %ecx 
5

两条指令:

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