x86 汇编中陷入分段错误

问题描述 投票:0回答:1

我试图用 printf 打印逗号后的每个字符,但它给了我分段错误

global main

extern printf

section .data
        num db "%d",0
        array db 2,4,3
        arrlen equ $ - array

section .text
main:
        mov ecx, 0

mainloop:
        cmp ecx, arrlen
        je exit

        movzx ebx, byte [array + ecx]
        push ebx
        push num
        call printf

        add esp, 8

        inc ecx
        jmp mainloop

exit:
        mov eax, 1
        xor ebx, ebx
        int 0x80

我什至尝试使用chatGPT xd

assembly x86 segmentation-fault
1个回答
0
投票

ECX 不是调用保留寄存器。

printf
可能会修改它,使基于 ECX 的循环运行时间过长,从而寻址超出数组的内存。
尝试使用 EBX,它是一个调用保留寄存器:

main:
        xor   ebx, ebx
        jmp   beginloop
mainloop:
        movzx eax, byte [array + ebx]
        push  eax
        push  num
        call  printf
        add   esp, 8
        inc   ebx
beginloop:
        cmp   ebx, arrlen
        jb    mainloop
exit:
        mov   eax, 1
        xor   ebx, ebx
        int   0x80
© www.soinside.com 2019 - 2024. All rights reserved.