我在电脑上玩装配。我编写了以下程序,首先通过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。
为什么会这样?
谢谢