2013-07-25 84 views
0

我想知道是否有人能夠幫助我理解爲什麼我的裝配程序給了我一個分段錯誤。 (不要擔心,這是一個相當短節目。)簡單的裝配程序給出了分段錯誤

segment .data 

    a dq 175 
    b dq 4096 


segment .text 

    global _start 

_start: 

    mov rax, [a] ; move *a into rax 
    add rax, [b] ; add *b to rax 
    xor rax, rax ; set to zero 
    ret    ; return 

它應該增加a和b的值,然後返回它們作爲最後的退出代碼的程序終止時,對不對?那麼echo $?應該打印4271由於xor,它應該打印0。

但是,是的,編譯使用:nasm -f elf64 -l main.lst main.asm -o main.o && ld main.o -o main.exec

然後運行:./main.exec && echo $?

幫助是極大的讚賞一如既往。

回答

3

您不能從_start標籤ret因爲它不是call ed。

segment .data 

    a dq 175 
    b dq 4096 


segment .text 

    global _start 

_start: 

    mov rax, [a] ; move *a into rax 
    add rax, [b] ; add *b to rax 
    xor rax, rax ; set to zero 

    mov rdi, rax 
    mov al, 60 ; sys_exit 
    syscall 

試試看。 (未經測試!)

+0

哦爆炸,現在如此明顯 – user3728501

+0

爲什麼你將rad移動到rdi btw? PS:我在Linux上,所以我認爲我需要int 0x80而不是mov al,60 – user3728501

+0

不,'rax'的高部分是0,所以'mov al,60'使'rax' 60(sys_exit)。 'rdi'是第一個(唯一的)參數。 64位Linux使用'syscall'而不是'int 0x80'。 'int 0x80'仍然可以在64位代碼中使用,舊的32位系統調用號碼(我被告知)。 –