【问题标题】:why do I get segmentation fault when calling printf in x86?为什么在 x86 中调用 printf 时出现分段错误?
【发布时间】:2015-04-04 15:41:02
【问题描述】:

我正在尝试通过在汇编代码中调用 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

【问题讨论】:

  • eaxecxedx调用者保存 寄存器。因此,您不应依赖任何这些寄存器的值在函数调用中保留。

标签: assembly x86 segmentation-fault printf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 2018-06-06
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多