2015-11-14 45 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)