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
)使用额外的寄存器?并在一个指令?
x86架构没有特别高效,灵活,或正交。其他的CPU会让这些约束更容易,但不是全部。一些有许多寄存器的CPU的编程约定倾向于保留寄存器来始终保持常量1(1)以优化这种类型的操作。 (想起[CDC Cyber](https://en.wikipedia.org/wiki/CDC_Cyber)) – wallyk
如果您可以使用额外的reg,较短的解决方法是'lea -1(%ecx),%edx/push%edx'。否则,您需要将寄存器中的值完全计算为其他指令的输入。立即值必须是汇编时常量(这就是为什么你从汇编程序中得到这个错误)。 –