用于循环的nasm程序集

时间:2015-11-23 04:54:04

标签: assembly nasm

我正在尝试构建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

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:2)

ecx是循环变量。它通常是调用者保存的 - 也就是说,允许覆盖printf之类的函数而不是恢复旧值。因此,从printf返回时,ecx将是垃圾。

要解决此问题,您可以在推送参数之前添加push ecx,然后在pop ecx删除函数参数之后添加add esp