简单的装配级程序会产生分段错误

时间:2013-07-25 02:43:59

标签: assembly 64-bit nasm

我想知道是否有人可以帮助我理解为什么我的汇编程序给我一个分段错误。 (别担心,这是一个相当短的程序。)

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 $?

一如既往地非常感谢帮助。

1 个答案:

答案 0 :(得分:3)

ret标签不能_start,因为它不是call

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

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

试试吧。 (未经测试!)