【发布时间】:2015-11-23 04:54:03
【问题描述】:
我正在尝试构建 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
有人知道我哪里做错了吗?
【问题讨论】:
-
ECX (您的循环变量)需要在调用 printf 之前保留(保存)。 Linux 上 32 位代码的 C 调用约定是 EAX、ECX 和 EDX 可能会被函数调用破坏。如果您需要这些寄存器中的任何一个成为调用之前的状态,则需要保存它,然后在之后恢复它。您对 EAX 有同样的问题