什么是“分段错误:11”? (Mac os x GCC程序集运行时错误)

时间:2013-01-13 01:18:25

标签: macos gcc assembly runtime-error x86-64

此代码使用终端中的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 ?? ()

关于为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:2)

mov %rbp, %rsp会破坏堆栈指针。您可能需要mov %rsp, %rbp

由于历史原因,一些汇编程序认为操作数是从左到右的,而另一些则是从右到左。

答案 1 :(得分:1)

由于您将rbp的值写为rsp,因此您会遇到分段错误,尽管您应该采取相反的做法:

push %rbp
mov %rbp,%rsp

这很容易解决:

push %rbp
mov %rsp,%rbp