-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

rbpの値を書き込むため、セグメンテーション違反が発生しますがrsp、逆のことを行う必要があります。

push %rbp
mov %rbp,%rsp

これは簡単に修正できます。

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