0

この単純なプログラムを実行しようとしています:

int main (void) {
  __asm__ ("mov 123, %rax");
  return 0;
}

問題なくコンパイルさobjdumpれ、結果が期待どおりであることを確認します。

00000000004004ec <main>:
  4004ec:   55                      push   %rbp
  4004ed:   48 89 e5                mov    %rsp,%rbp
  4004f0:   48 8b 04 25 7b 00 00    mov    0x7b,%rax
  4004f7:   00 
  4004f8:   b8 00 00 00 00          mov    $0x0,%eax
  4004fd:   5d                      pop    %rbp
  4004fe:   c3                      retq
  4004ff:   90                      nop

ただし、プログラムを実行すると、実行時に正確にセグメンテーション違反が発生しmov 0x7b,%raxます。を使用しても同じことが起こります%eax。なぜだろう?

4

1 に答える 1

2

ああ、質問を投稿してから数秒後に見つけました。番号の前の を忘れました$(住所として扱われていました)。

正しいコードは次のとおりです。

int main (void) {
  __asm__ ("mov $123, %rax");
  return 0;
}

教訓: 夜にコードを書いてはいけません!

于 2013-06-23T10:56:48.407 に答える