«Ошибка сегментации» при попытке вывести целое число - PullRequest
0 голосов
/ 04 апреля 2020

Я пытался написать процедуру сборки, которая печатает число. Я написал процедуру printc, которая печатает один символ:

printc: push    ebp
        mov     ebp, esp

        mov     eax, 4
        mov     ebx, 1

        add     [ebp + 8], byte '0' 
        lea     ecx, [ebp + 8]

        mov     edx, 1

        int     0x80

        mov     esp, ebp
        pop     ebp

        ret

Затем я попытался написать printi так:

printi: push    ebp
        mov     ebp, esp

        mov     eax, [ebp + 8]

        cmp     eax, 0
        je      end

        mov     ebx, 10
        div     ebx

        push    eax
        call    printi

        push    edx
        call    printc

end:    mov     esp, ebp
        pop     ebp

        ret

Наконец, я позвонил printi:

_start: push    32 
        call    printi

И получил Segmentation fault (core dumped). Есть идеи почему?

1 Ответ

1 голос
/ 04 апреля 2020

Как правильно сказал Питер Кордес, ваша программа упадет на _start и вернется к неопределенному коду, если она не обработала sh ранее из-за бесконечной рекурсии в printi.

Причина существует бесконечная рекурсия: вы, вероятно, думаете, что div ebx делит EAX на 10. Это не так: она делит EDX:EAX 64-битное значение на EBX, и вы не контролируете EDX.

Обнуление EDX до DIV позволяет программе что-то напечатать (но не желаемый вывод), затем cra sh, когда оно падает printi.

...