アセンブリ言語がマイクロコンピューターアーキテクチャクラスでどのように機能するかを理解しようとしています。また、例ではさまざまな構文に直面しています。
sub $48, %esp
mov %eax, 32(%esp)
これらのコードはどういう意味ですか? espレジスタへの32オペランドの追加とは何ですか?
それはIntel構文ではなく、その AT&T構文 は GAS構文 とも呼ばれます。
$
接頭辞は即値(定数)用であり、%
接頭辞はレジスター用です(これらは必須です1)。
AT&T構文の詳細については、 the [att]
tag wiki も参照してください。
1noprefix
オプションが指定されていない限り、 here & here を参照してください。ただし、通常、noprefix
はMASMのような構文を取得するために.intel_syntax noprefix
でのみ使用されます。
はい。「32(%esp)」は、%espからの32のオフセットを示します。
Intel構文と比較して、AT&T構文には多くの違いがあります
$
は定数(整数リテラル)を示します。それがなければ、番号は絶対アドレスです%
はレジスタを示します()
は、Intel構文の[]
のように、メモリ参照に使用されますしたがって、上記のスニペットは次と同等です
sub esp, 48 ; esp -= 48
mov [esp+32], eax ; store eax to the value at the address `esp + 32`
@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).
これはx86のAT&T構文です。 AT&T %
は一般にレジスタを示し、$
は即時用に予約されています。省略した場合$
アセンブラは48をアドレスとして解釈します。