对于x86汇编中的循环

时间:2014-02-16 03:16:11

标签: assembly

我不明白为什么我可以使用ebx寄存器而不是{for循环的ecx寄存器。

section .data
msg:    db "Hello World",10,0
section .text
    global _main
    extern _printf


_main:

    mov ebx, 5
    push ebx

.next:
    ;push dword msg

    push msg
    call _printf
        add esp,4       
    sub ebx, 1

    jne .next          



    add esp,4          
    mov eax,0         


    ret

我认为call _printf正在弄乱ecx寄存器,从而导致循环无限期地继续?

如何保留ecx寄存器,使其不受call _printf

的影响

1 个答案:

答案 0 :(得分:1)

对于80x86的32位C调用约定;寄存器EAX,ECX和EDX是“调用者保存”。这意味着任何C函数都可以删除这些寄存器。

其余寄存器(EBX,ESI,EDI和EBP)是“被调用者保存”,不能被C函数破坏。

如果您想使用ECX而不是EBX;那么你必须做这样的事情:

.next:
    push ecx         ;Save ECX

    push msg
    call _printf
    add esp,4       

    pop ecx          ;Restore ECX
    sub ecx, 1
    jne .next

当然这只会降低代码效率。