为什么在 x86 中调用 printf 时出现分段错误?

why do I get segmentation fault when calling printf in x86?

我试图通过在汇编代码中调用 printf 来逐个字符地打印一个字符串,但是在打印第一个字符后出现分段错误,我不明白为什么会这样,可以请有人帮忙??

section .rodata
lc:
    DB  "%c", 10, 0

section .text
    align 16
    global my_func
    extern printf

my_func:
    push    ebp
    mov ebp, esp    ; Entry code - set up ebp and esp
    pusha           ; Save registers

    mov ecx, dword [ebp+8]  ; Get argument (pointer to string)

incr:   
    cmp byte [ecx], 0
    jz end

    movzx eax, byte [ecx]
    push eax
    push lc
    call printf
    add esp, 8

    inc ecx
    jmp incr

end:    
    popa            ; Restore registers
    mov esp, ebp    ; Function exit code
    pop ebp
    ret

我假设您在 C 运行时调用 printf。我不认为 C 函数需要在调用之间保留寄存器的值,因此 ECX 可能会被调用破坏。