推送到堆栈时x64程序集分段错误(gnu程序集)

时间:2016-06-30 13:06:31

标签: linux assembly x86-64 gas

我在电脑上玩装配。我编写了以下程序,首先通过Linux的write syscall输出一个字符串,然后通过调用printf输出

.text
.global main

main:
# write syscall
movl $4, %eax
movl $1, %ebx
movl $message, %ecx
movl $len, %edx
int $0x80
#push %rax

# printf
push %rbp
mov %rsp,%rbp

mov $message, %rdi
callq printf

pop %rbp
#pop %rax

movl $0x0, %eax
retq
.data

message: .ascii "Hello World, I'm an assembly program\n\0"

len = . - message - 1

程序运行正常。但是一旦取消注释两个push / pop%rax命令,程序就会在printf例程中抛出一个分段错误。 推/弹在这种情况下毫无意义,但我想知道为什么它会破坏printf。

为什么会这样?

谢谢

0 个答案:

没有答案