为什么此代码在汇编中导致无限循环

时间:2013-06-11 12:17:02

标签: assembly x86

我在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

3 个答案:

答案 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