web-dev-qa-db-ja.com

ドル($)とパーセンテージ(%)記号はx86アセンブリで何を表していますか?

アセンブリ言語がマイクロコンピューターアーキテクチャクラスでどのように機能するかを理解しようとしています。また、例ではさまざまな構文に直面しています。

sub $48, %esp
mov %eax, 32(%esp)

これらのコードはどういう意味ですか? espレジスタへの32オペランドの追加とは何ですか?

29
juliensaad

それはIntel構文ではなく、その AT&T構文GAS構文 とも呼ばれます。

$接頭辞は即値(定数)用であり、%接頭辞はレジスター用です(これらは必須です1)。

AT&T構文の詳細については、 the [att] tag wiki も参照してください。


1noprefixオプションが指定されていない限り、 herehere を参照してください。ただし、通常、noprefixはMASMのような構文を取得するために.intel_syntax noprefixでのみ使用されます。

23
Necrolis

はい。「32(%esp)」は、%espからの32のオフセットを示します。

2
aqua

Intel構文と比較して、AT&T構文には多くの違いがあります

  • $は定数(整数リテラル)を示します。それがなければ、番号は絶対アドレスです
  • %はレジスタを示します
  • ソース/デスティネーションの順序が逆になります
  • ()は、Intel構文の[]のように、メモリ参照に使用されます

したがって、上記のスニペットは次と同等です

sub esp, 48         ; esp -= 48
mov [esp+32], eax   ; store eax to the value at the address `esp + 32`
2
phuclv

@Necrolisが言ったように、それはAT&T構文で書かれています。その意味は:

subtract 48 from the register esp (the stack pointer).
store the contents of eax to the four bytes starting at (esp + 32).
1
Stephen Canon

これはx86のAT&T構文です。 AT&T %は一般にレジスタを示し、$は即時用に予約されています。省略した場合$アセンブラは48をアドレスとして解釈します。

0
Gunther Piez