0

Objective-Cコードから呼び出し可能な関数をアセンブリで記述しようとしています。設定して直接返すことで簡単な結果が得られまし%raxたが、スタックを使用してローカル変数を格納しようとすると、が得られEXC_BAD_ACCESSます。誰かがこれを見て、何が悪いのか教えてもらえますか?私のアセンブリは次のようになります。

.global _fn
_fn:
pushq %rbp
movq %rsp, %rbp
subq 0x8, %rsp
addq 0x8, %rsp
popq %rbp
ret

Xcodeはこれをダンプし、次の場所からsub 0x8,%rsp呼び出したときにクラッシュが発生したことを示します。fnmain

0x0000000100020000  <+0000>  push   %rbp
0x0000000100020001  <+0001>  mov    %rsp,%rbp
0x0000000100020004  <+0004>  sub    0x8,%rsp
0x000000010002000c  <+0012>  add    0x8,%rsp
0x0000000100020014  <+0020>  pop    %rbp
0x0000000100020015  <+0021>  retq
4

1 に答える 1

3

から8を引くだけでrsp、例外が発生することはありません。

ほとんどの場合、定数の前にドル記号を付ける必要があります。そうしないと、(g)asはそれらの数値を対応するアドレスのメモリオペランドとして扱います。

また、アドレス8のメモリへのアクセスは、通常、x86プラットフォームではNULLポインタの逆参照と同じくらい優れています。

于 2012-08-22T14:27:24.110 に答える