我正在使用带有ld链接器的NASM x86汇编程序,在MacOS上组装成Mach-O格式。我给自己写了一个挑战,即编写一个在终端中绘制一个盒子的程序,挑战在于我会尝试使用几乎所有语言中尽可能接近完全相同的行为来实现完全相同的程序。当我在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
我注意到程序将+
字符打印到终端后,我收到了段错误。它似乎是在执行print
子例程期间执行此操作,而不是在它退出时执行此操作。最初chr
字符串只有一个字节宽,但当我意识到它需要以空值终止时,我添加了另一个字节。这仍然无法解决问题。