將小於 %ecx 的 1 推入堆棧 (push 1 less than %ecx to stack)


問題描述

將小於 %ecx 的 1 推入堆棧 (push 1 less than %ecx to stack)

我正在嘗試將 比 %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 )?並在一條指令中?


參考解法

方法 1:

Without extra registers? Sure. dec/push/inc. One instruction? No.

decl  %ecx
pushl %ecx
incl  %ecx

方法 2:

Two instructions:

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

(by spsSami Kuhmonenrkhb)

參考文件

  1. push 1 less than %ecx to stack (CC BY‑SA 2.5/3.0/4.0)

#assembly #att #cpu-registers #x86






相關問題

內聯彙編 - cdecl 和準備堆棧 (Inline assembly - cdecl and preparing the stack)

ASM 使用代碼查找偏移量 (ASM find offset with code)

顯示字符的 Ascii 值 (Displaying Ascii values of characters)

x86 彙編程序崩潰,可能忽略了簡單的錯誤 (x86 assembly procedure crashes, possibly overlooking simple error)

是否可以在 C++ 結構中編寫靜態程序集數據? (Is it possible to write static assembly data in C++ struct?)

將小於 %ecx 的 1 推入堆棧 (push 1 less than %ecx to stack)

emu8086 : ARR 不包含任何值 (emu8086 : ARR do not contain any value)

劊子手游戲,語法修復 x86 gcc 程序集和 C (hangman game, syntax fix x86 gcc assembly & C)

如何將內存中的 96 位加載到 XMM 寄存器中? (How to load 96 bits from memory into an XMM register?)

如何使用 Assembly 中的 printf? (How do you use printf from Assembly?)

摩托羅拉 68HC12 實時中斷寄存器 (Motorola 68HC12 Real Time Interrupt Registers)

我可以用 OR 操作代替 MOV 操作嗎? (Can I substitute a MOV operation with an OR operation?)







留言討論