I tried to put code not in the main function, but directly into _start:
segment .text global _start _start: push rbp mov rbp, rsp ; ... program logic ... leave ret Compile:
yasm -f elf64 main.s ld -o main main.o Run:
./main Segmentation fault(core dumped) I read, leave is
mov esp,ebp pop ebp But why is it that such an epilogue to the pop stack frame and the set base frame pointer to a previous frame's base results in a segmentation fault?
Indeed, making an exit system call exits gracefully.

_startis not called by the kernel, you cannot return from it.