我正在尝试编写编译器,但我擅长于此。它在没有任何错误的情况下编译/汇编,但在运行时给了我segfault。
这是我组装汇编源代码(在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
ret
在call main
之后返回后,控件最终以call
之后的指令结束,这恰好是main
的开始。在mov
指令进行第二次运行之后,接下来是ret
,但是现在没有相应的call
,导致指令指针指向堆栈上的下一个字节。几乎可以肯定不会是可执行的内存,因此当试图执行此处时会发生segfault。