【发布时间】:2012-09-29 01:40:08
【问题描述】:
我目前正在 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。
任何见解将不胜感激。
【问题讨论】:
-
感谢您不使用已弃用的作业标签——它使我们免于这些争论。
-
我不知道还有一个“作业”标签,或者这样的事情是禁忌。现在我知道了,我猜?
-
@derp 大约晚了一年,但是是的。
标签: assembly stack 64-bit nasm cpu-registers