我试图在NASM中编写一个简单的汇编程序,该程序将打印Hello World 5次。但是在无限循环打印问候世界中执行失败。我尝试调试代码,发现ecx未正确执行,并且eax显示其他值。我的代码如下:

    section .data
    msg:    db "Hello World",10,0
    section .text
        global main
        extern printf
    main:   push ebp
        mov ebp,esp

        mov ecx,0
        mov DWORD[esp-4],0x5
        mov eax,DWORD[esp-4]
        jmp .loop
   .loop:
        push eax
        push ecx
        add esp,8

        pop ecx
        pop eax

        cmp ecx,eax
        jne .task

        jmp .done
     .task:
        push DWORD msg
        call printf
        add esp,4

        add ecx,1

        jmp .loop
      .done:
        mov esp,ebp
        pop ebp
        ret


你能通过显示我的缺点来帮助我吗?

最佳答案

根据X86 calling conventions,寄存器EAX,ECX和EDX被调用者保存。在调用printf之前先保存它们,然后再恢复。

您的代码中还有一个我听不懂的片段(add esp, 8被循环中的push / pop包围)。在这里我无法提供任何解释,但是如果您也不理解,那可能是错误的。

关于c - 无法在NASM中执行循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14676521/

10-11 18:58