-1

たとえばコードを書いた

.global _start
.data
str:
    .long 0x1
.text
_start:
  mov  $1, %rax         # system call 1 is write
  mov  $0x21, %rdx
  mov  %rdx, 4(%rax)

  mov  $60, %rax        # system call 60 is exit
  xor  %rdi, %rdi       # we want return code 0
  syscall               # invoke operating system to exit

セグメンテーション違反が発生するのはなぜですか?いつメモリロケーションを使用しますか?メモリロケーションをどのように使用しますか?

4

1 に答える 1

1

rdxの値をメモリ位置5に書き込もうとしています(rax + 4、raxは1に初期化されました)。

このプログラムを実際のコンピューターまたはシミュレーターで実行していますか?

コンピュータで実行している場合は、任意のメモリ位置に書き込むことはできません。オペレーティングシステムはプロセスに一定量のメモリを割り当てます。プロセスがこの範囲外のメモリにアクセスしようとすると、セグメンテーション違反が発生する可能性があります。

シミュレーターで実行していて、OSがない場合は問題ありません。メモリに書き込みたい場合は、次のようにデータセグメントで変数を宣言します。

.data
myvar:
    .long 0x1
.text
_start:
  #....
  mov  %rdx, myvar
  #...
于 2013-03-24T12:55:44.660 に答える