このページには、GASのIntelとAT&Tの構文の違いの良いリストが含まれていますが、変位のみで住所を指定する場合については説明していません。
ここでは、AT&T構文を使用して4行を組み立てました。
.text
0000 48C7C008000000 mov $8, %rax
0007 488B042508000000 mov (8), %rax
000f 4889F0 mov %rsi, %rax
0012 488B06 mov (%rsi), %rax
予想通り、最初の2行は異なります。1つ目は即値8をraxに移動し、2つ目はアドレス8の内容をraxに移動します。しかし、Intel構文では、次の奇妙な動作が発生します。
.text
.intel_syntax
0000 48C7C008000000 mov %rax, 8
0007 48C7C008000000 mov %rax, [8]
000e 4889F0 mov %rax, %rsi
0011 488B06 mov %rax, [%rsi]
ここでは、1行目と2行目が同じマシンコードにアセンブルされています。最初は角かっこが間違っていると思ったので、テストに3行目と4行目を追加しました。角かっこは、少なくともレジスタが関係している場合は、メモリアドレス指定に使用できます。
私が読んだすべてのドキュメントは、少なくともベースレジスタまたはインデックスレジスタ、場合によってはスケールとディスプレイスメントを備えたメモリアドレス指定の例を示していますが、ディスプレイスメントだけではありません。
私はNASMアセンブラを使用したIntel構文の経験があります。NASMアセンブラはとを区別しmov rax, 8
ますmov rax, [8]
。
これはGASのバグですか?または、そうでない場合、NASMに相当するものを指定するにはどうすればよいmov rax, [8]
ですか?
変位のみのアドレスを指定することはおそらく珍しいことですが、この構文を使用してすべてのメモリアドレス指定形式を完全に理解したいと思います。