Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法在NASM中执行循环_C_Assembly_X86_Nasm - Fatal编程技术网

C 无法在NASM中执行循环

C 无法在NASM中执行循环,c,assembly,x86,nasm,C,Assembly,X86,Nasm,我试着用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

我试着用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
您能帮我显示一下我的故障吗。

根据,寄存器EAX、ECX和EDX都已保存。在调用
printf
之前保存它们,然后恢复

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

Anton(以上)是正确的-无法解释的
add esp,8
将丢弃堆栈并将一切都搞糟(您应该假设
printf
将丢弃您所依赖的ECX和EAX中的值)

以下是参考版本:

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


main:
    push dword 0x5     ;count = 5;

.next:
    push dword msg
    call printf
    add esp,4

    sub dword [esp],1  ;count--;
    jne .next          ;if(count != 0) goto next;

    add esp,4          ;Remove "count" from stack
    mov eax,0          ;Value to return from "main"
    ret

我不太了解ASM,但我认为您可以从和开始