【问题标题】:Assembly program gives me segfault汇编程序给了我段错误
【发布时间】:2019-02-16 16:18:00
【问题描述】:

我正在尝试编写一个编译器,但我不太擅长。它编译/组装没有任何错误,但它在运行时给了我段错误。

这是我如何组装我的汇编源代码(在 ubuntu linux 上):

nasm -f elf64 assembly.asm
ld -s -o assembly assembly.o --entry entrypoint
./assembly ; echo $?

这是我的汇编源代码:

global entrypoint
entrypoint:
    call main 
main:
    mov eax, 0
    ret

这是它给我的:

Segmentation fault      (core dumped) ./assembly

【问题讨论】:

    标签: assembly segmentation-fault nasm


    【解决方案1】:

    retcall main之后返回,控制在call之后的指令结束,恰好又是main的开头。在mov 指令第二次运行后,next 又是ret,但现在没有对应的call,导致指令指针指向恰好在堆栈中的下一个字节。这几乎肯定不会成为可执行内存,因此当它尝试在那里执行时会发生段错误。

    【讨论】:

    • 在 x86-64 System V ABI 中,进程入口 (_start:) 上的 rsp 指向 argc(一个小整数,不是有效的返回地址)。与 Windows 不同,没有任何地方可以使用的返回地址,您需要进行 _exitexit_group 系统调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多