Я использую ассемблер 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
имела ширину всего один байт, но я добавил еще один байт, когда понял, что его нужно будет завершать нулем. Это все еще не решило проблему.