我在 Assemby 中有一小段代码,它基本上通过循环运行并以相反的顺序打印值,但是当我运行时,它进入无限循环。下面是代码。
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
由于评论太长了,我就把它放在这里:我使用被调用者保存寄存器的意思是这样的
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
我们不这样做的原因。
当你调用一个函数时,你必须确定使用了哪些寄存器。如果你调用一个 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
谢谢大家的帮助。这就是我按照哈罗德的建议所做的。谢谢哈罗德
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