マイクロコンピューターアーキテクチャクラスでアセンブリ言語がどのように機能するかを理解しようとしていますが、例ではさまざまな構文に直面し続けています。
sub $48, %esp
mov %eax, 32(%esp)
これらのコードはどういう意味ですか?espレジスタに追加された32オペランドは何ですか?
これは Intel 構文ではなく、そのAT&T 構文であり、 GAS 構文とも呼ばれます。
$
プレフィックスは即値 (定数) 用で、プレフィックス%
はレジスター用です (これらは必須です1 )。
AT&T 構文の詳細については、[att]
タグ wikiも参照してください。
1noprefix
オプションが指定されていない場合は、こことここを参照してください。ただし、通常は、MASM のような構文を取得するために ,noprefix
とのみ使用されます。.intel_syntax noprefix
はい、「32(%esp)」は %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 をアドレスとして解釈します。