Assembly 将小于%ecx的1推送到堆栈

Assembly 将小于%ecx的1推送到堆栈,assembly,x86,cpu-registers,att,Assembly,X86,Cpu Registers,Att,我正在尝试将一个小于%ecx的值推送到堆栈上 所以我尝试了这个指令: 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)来实现这一点?并

我正在尝试将一个小于%ecx的值推送到堆栈上

所以我尝试了这个指令:

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
)来实现这一点?并且在一条指令中?

没有额外的寄存器?当然dec/push/inc.一条指令?没有

decl  %ecx
pushl %ecx
incl  %ecx
两个说明:

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

x86体系结构不是特别高效、灵活或正交的。其他CPU将使满足其中一些约束变得更容易,但并非所有约束都更容易。对于具有大量寄存器的CPU,某些编程约定倾向于保留一个寄存器,以始终保持常量1(一),从而优化这种类型的操作。(我想起来了。)如果您可以使用额外的reg,那么较短的解决方法是
lea-1(%ecx),%edx/push%edx
。否则,您需要在寄存器中完整计算一个值,作为其他指令的输入。立即值必须是汇编时间常数(这就是为什么从汇编程序中得到该错误)。