2015-04-04 57 views
0

我想通過調用打印字符串字符char,通過調用匯編代碼中的printf,但打印第一個字符後,我得到分段錯誤,我不明白爲什麼發生,請有人可以幫助請??爲什麼在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 
+0

'eax','ecx'和'edx'是_caller-saved_寄存器。所以你不應該依賴任何這些寄存器的值在一個函數調用中被保留。 – Michael 2015-04-04 15:55:23

回答

0

我假設你在C運行時調用printf。我不相信需要C函數來保存跨呼叫的寄存器的值,所以ECX可能被呼叫破壞。

相關問題