我目前正在64位机器上写一个汇编NASM,打印给定输入的阶乘,然后返回输入。程序可以正确地打印阶乘值,但是返回值不返回输入。是的,代码很糟糕,我不希望你简单地重写整本书。(这是我的家庭作业。)我只想有人解释一下为什么我的返回寄存器(rax)没有保留它从一开始就有的值。
extern read_input
extern print_int
call read_input
push rax ;save n
mov rcx, 1 ;counter
push rcx ;save counter
push rdi ;save print int
jmp test
print:
pop rdi
imul rdi, rcx ;multiply by current counter
push rdi ;save our multiplication factor
call print_int
pop rdi
pop rcx
pop rax ;restore trashed variables
add rcx, 1 ;increment counter by 1
push rax ;push stuff back on stack
push rcx
push rdi
jmp test
test:
cmp rcx, rax
jle print
pop rax
pop rcx
pop rdi ;clear stack
ret
输出:
Please enter an input value:
read_input> Returning 4 (0x4)
Printing integer 1 (0x1)
Printing integer 2 (0x2)
Printing integer 6 (0x6)
Printing integer 24 (0x18)
Program complete. Return 24 (0x18)
我希望它返回我的输入,在本例中为4。
任何见解都将不胜感激。
2条答案
按热度按时间jdzmm42g1#
按下和弹出的顺序错误。
推动:
流行音乐:
最后,
rax
和rdi
被交换,哎呀。fzwojiic2#
问题是,栈中的位置没有名字或标识符,你必须按照相同的顺序压入和弹出,当你输入
pop rax
时,处理器不会说“push rax
创建的最后一个条目在哪里?",而是说“最新压入的条目在哪里?",所以你的栈看起来像这样(假设rax 1,rbx 2,rcx 3):只要遵循以下规则:始终按照弹出的顺序推送内容,除非您显式地尝试切换值(使用
xchg
更好)。注意:按错误顺序执行操作可用于设置
rflags
寄存器等内容的值: