8

このページには、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]ですか?

変位のみのアドレスを指定することはおそらく珍しいことですが、この構文を使用してすべてのメモリアドレス指定形式を完全に理解したいと思います。

4

2 に答える 2

7

確かにそのようなバグがありました-http ://sourceware.org/bugzilla/show_bug.cgi?idgas =10637を参照してください。

binutils 2.21.51で(またはおそらく以前に)修正されたようです。

于 2012-04-19T23:11:41.263 に答える
2

ここでは、AT&T構文の非常に特殊なコーナーケースが表示されています。通常、アドレスオペランドの場合、次のようになります。

<op> [ src, ] displacement(base,index,scale) [, tgt ]

AT&T構文のアドレスオペランドの構成要素はいずれもオプションであるため、またはその他のそのような組み合わせを記述できmov (%rax, %rbx), ...ますmov 0(%rax, %rbx, 1), ...

括弧内()通常持つことができる唯一の数値は、スケール係数(存在する場合)です。

ただし、アセンブラは次のものも受け入れます(そして同じコードを作成します)。

mov <absolute>, ...
mov (<absolute>), ...

これは、内部のオペランド()が単純な数値/絶対アドレスである場合にのみ機能します。そうでない場合、アセンブラは、指定したものが有効なスケール係数ではないと文句を言います。この同等性はAT&T構文の特殊なケースです-なぜそれが許可されたのか/許可されたのかわかりません。

$ただし、AT&T構文での使用は、アドレスオペランドではなく、常に定数を指定します。これは、 Intel構文の裸の数値と同じです。

以下は、同等性を示しています。

$ cat t.s
        mov     (8), %rax
        mov     $8, %rax
        mov     8, %rax
.intel_syntax
        mov %rax, [ 8 ]
        mov %rax, 8
        mov %rax, %ds:8

$ objdump -w -d t.o

t.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 <.text>:
   0:   48 8b 04 25 08 00 00 00         mov    0x8,%rax
   8:   48 c7 c0 08 00 00 00            mov    $0x8,%rax
   f:   48 8b 04 25 08 00 00 00         mov    0x8,%rax
  17:   48 8b 04 25 08 00 00 00         mov    0x8,%rax
  1f:   48 c7 c0 08 00 00 00            mov    $0x8,%rax
  26:   48 8b 04 25 08 00 00 00         mov    0x8,%rax

$ objdump -w -M intel -d t.o

t.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 :
   0:   48 8b 04 25 08 00 00 00         mov    rax,ds:0x8
   8:   48 c7 c0 08 00 00 00            mov    rax,0x8
   f:   48 8b 04 25 08 00 00 00         mov    rax,ds:0x8
  17:   48 8b 04 25 08 00 00 00         mov    0x8,%rax
  1f:   48 c7 c0 08 00 00 00            mov    rax,0x8
  26:   48 8b 04 25 08 00 00 00         mov    rax,ds:0x8
于 2012-04-19T10:33:13.533 に答える