Почему эта программа сборки x86 segfaulting? - PullRequest
0 голосов
/ 04 мая 2018

Я использую ассемблер NASM x86 с компоновщиком ld, собираясь в формат Mach-O на MacOS. Я поставил перед собой задачу написать программу, которая рисует рамку в терминале, с той проблемой, что я попытался бы реализовать ту же самую программу с максимально близким к тому же поведению, насколько это возможно, почти на каждом языке, который я знаю. Когда я приступил к реализации в сборке x86, я столкнулся с некоторыми проблемами. Я сделал несколько ошибок, используя неправильный синтаксис, неправильную битовую ширину и т. Д., И мне удалось обнаружить и исправить большинство из них. Вот программа на данный момент:

global start

segment .data
width   dd      5
height  dd      5

segment .bss
chr     resb    2       ;; Current character to print

segment .text
start:
        mov     byte [chr+1],0  ;; Null-terminate chr
top     mov     byte [chr],43   ;; + character
        call    print
        call    exit

print   push    dword 1     ;; Arg 3 for write
        push    dword chr   ;; Arg 2 for write
        push    dword 0     ;; Arg 1 for write
        mov     eax,4       ;; 4 = write system call
        add     esp,-4      ;; Align esp
        int     80h         ;; Software interrupt
        ret                 ;; Return to caller

exit    push    dword 0     ;; Arg 1 for exit
        mov     eax,1       ;; 1 = exit system call
        add     esp,-4      ;; Align esp
        int     80h         ;; Software interrupt
        ret                 ;; Return to caller

Я заметил, что я получаю segfault после того, как программа напечатает символ + на терминале. Похоже, что это происходит во время выполнения подпрограммы print, а не при ее выходе. Первоначально строка chr имела ширину всего один байт, но я добавил еще один байт, когда понял, что его нужно будет завершать нулем. Это все еще не решило проблему.

...