在 nasm 64 位中使用 printf 时出现分段错误

Segmentation fault when using printf in nasm 64bit

我正在尝试在 nasm 64 位 linux 中调用 printf。但是当我 运行 它时它会输出分段错误。我对齐堆栈,在字符串末尾添加一个 0 转义字符。但它仍然输出段错误。

代码:

section .data
_DATA1 db "aa", 0

section .text
global main
extern printf
main:
sub rsp, 16
lea r13, [_DATA1]
mov rdi, r13
call printf
add rsp, 16
mov rax, 0
ret 

assemble 和 link 以及

nasm -f elf64 a.asm
gcc -no-pie a.o

我哪里做错了?

好的,我知道了。 原来我需要在 main 之后添加:

push rbp
mov rbp, rsp

因此代码如下所示:

section .data
_DATA1 db "aa", 0

section .text
global main
extern printf
main:
push rbp
mov rbp, rsp
sub rsp, 16
lea r13, [_DATA1]
mov rdi, r13
call printf
add rsp, 16
mov rax, 0
mov rsp, rbp
pop rbp
ret 

我意识到这也是 gcc 所做的