为什么这个x86汇编程序是segfaulting?

时间:2018-05-04 19:00:25

标签: assembly x86 segmentation-fault nasm

我正在使用带有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字符串只有一个字节宽,但当我意识到它需要以空值终止时,我添加了另一个字节。这仍然无法解决问题。

0 个答案:

没有答案