我在Assembly中有一小段代码,基本上是以相反的顺序运行循环和打印值,但是当我运行时,它会进入infinte循环。下面是代码。
section .data
x db "value=%d"
section .text
global main
extern printf
main:
mov eax, 10
well_done:
push eax
push x
call printf
add esp,8
dec eax
cmp eax ,0
jnz well_done
ret
答案 0 :(得分:1)
调用函数时,必须确定使用了哪些寄存器。如果你调用C函数eax
可以用于函数所需的任何函数,那么在执行函数之前必须push eax
,并且在它返回之后你可以pop
它。
section .data
x db "value=%d"
section .text
global main
extern printf
main:
mov eax, 10
well_done:
push eax <- save the counter
push eax <- argument for printf
push x
call printf
add esp,8 <- clears the stack with the arguments for printf
pop eax <- restore the counter
dec eax
cmp eax ,0
jnz well_done
ret
答案 1 :(得分:1)
由于评论太长了,我只想把它放在这里:使用callee-save寄存器的意思是这样的
section .data
x db "value=%d"
section .text
global main
extern printf
main:
mov ebx, 10
well_done:
push ebx
push x
call printf
add esp, 8
dec ebx
jnz well_done
ret
请注意,通常使用ebx
意味着您应该在输入时保存ebx
并在退出时将其恢复,但因为这是main
,我们就不会这样做了。
答案 2 :(得分:0)
感谢大家的帮助。这就是我按照哈罗德的建议做的事情。谢谢哈罗德
section .data
x db "value=%d"
section .text
global main
extern printf
main:
mov ebx, 10
well_done:
push ebx
push x
call printf
add esp,4
pop ebx
dec ebx
cmp ebx ,0
jnz well_done
ret