-1

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

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

4

2 回答 2

2

mov %rbp, %rsp破坏堆栈指针。你可能想要mov %rsp, %rbp

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

于 2013-01-13T01:24:00.060 回答
1

你得到分段错误,因为你写了rbpto的值rsp,尽管你应该做相反的事情:

push %rbp
mov %rbp,%rsp

这可以很容易地解决:

push %rbp
mov %rsp,%rbp
于 2013-01-13T01:24:13.107 回答