我尝试将代码不放在主函数中,而是直接放在 _start
中:
segment .text
global _start
_start:
push rbp
mov rbp, rsp
; ... program logic ...
leave
ret
编译:
yasm -f elf64 main.s
ld -o main main.o
运行:
./main
Segmentation fault(core dumped)
我读完了,离开是
mov esp,ebp
pop ebp
但为什么弹出堆栈帧的这种尾声和指向前一帧基的设置基帧指针会导致段错误?
确实,进行退出系统调用可以优雅地退出。
最佳答案
根据 ABI 1 _start
入口处的栈是
没有“返回地址”。
退出进程的唯一方法是通过 SYS_EXIT
xorl %edi, %edi ;Error code
movl $60, %eax ;SYS_EXIT
syscall
1 3.4.1 初始堆栈和寄存器状态部分。
关于assembly - 为什么从 _start 段错误返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39553289/