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吗?它应该打印 0,因为xor.

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

然后运行:./main.exec && echo $?

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

4

1 回答 1

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

试试看。(未经测试!)

于 2013-07-25T03:00:39.787 回答