我正在尝试构建for循环,但它给了我无限循环:
SECTION .data
i: dd 0
message: db "The number is %d",10,0
SECTION .text
extern printf
global main
main:
push ebp
mov ebp, esp
mov eax, DWORD [i]
mov ecx, DWORD 10
L1:
add eax, DWORD 1
push eax
push message
call printf
add esp, 8
loop L1
mov esp, ebp
pop ebp
nasm无限地给我输出The number is 18
。但是,如果我将printf
放在代码的末尾。它给了我正确的输出
L1:
add eax, DWORD 1
loop L1
push eax
push message
call printf
add esp, 8
mov esp, ebp
pop ebp
任何人都知道我做错了什么?
答案 0 :(得分:2)
ecx
是循环变量。它通常是调用者保存的 - 也就是说,允许覆盖printf
之类的函数而不是恢复旧值。因此,从printf
返回时,ecx
将是垃圾。
要解决此问题,您可以在推送参数之前添加push ecx
,然后在pop ecx
删除函数参数之后添加add esp
。