0

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

3 回答 3

1

由于评论太长了,我就把它放在这里:我使用被调用者保存寄存器的意思是这样的

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我们不这样做的原因。

于 2013-06-11T14:01:22.163 回答
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
于 2013-06-11T12:59:33.767 回答
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
于 2013-06-11T13:11:32.813 回答