此代码使用终端中的GCC组装好:
.globl _sub
_sub:
push %rbp
mov %rbp,%rsp
mov $0xBEEF,%eax
pop %rbp
ret
.globl _main
_main:
push %rbp
mov %rbp,%rsp
call _sub
mov $0,%eax
pop %rbp
ret
但是当我运行a.out文件时,我收到此错误:
Segmentation fault: 11
如果我在GDB中运行它,这就是我得到的错误:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000001
0x0000000000000001 in ?? ()
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:2)
mov %rbp, %rsp
会破坏堆栈指针。您可能需要mov %rsp, %rbp
。
由于历史原因,一些汇编程序认为操作数是从左到右的,而另一些则是从右到左。
答案 1 :(得分:1)
由于您将rbp
的值写为rsp
,因此您会遇到分段错误,尽管您应该采取相反的做法:
push %rbp
mov %rbp,%rsp
这很容易解决:
push %rbp
mov %rsp,%rbp