12

(AT&T と Intel の両方の構文で) を.text使用して一部のバイナリのセクションを逆アセンブルすると、、、または.objdump.scmpb.s %bh,%chsbbl.s %edi,%ediadcb.s %bl,%dh

サフィックスには有効/有用な意味がありますか.s(おそらくサフィックスとしてでさえありません)、またはこれは、命令のシーケンスであるかのように、一部のデータ/パディングを逆アセンブルするアーティファクトですか? ありがとうございました。

4

2 に答える 2

14

サフィックスの意味を理解する.sには、x86 命令がどのようにエンコードされるかを理解する必要があります。adc例として取り上げると、オペランドが取ることができる主な形式が 4 つあります。

  1. ソース オペランドは即値で、デスティネーション オペランドはアキュムレータ レジスタです。
  2. ソース オペランドは即値で、デスティネーション オペランドはレジスタまたはメモリ ロケーションです。
  3. ソース オペランドはレジスタであり、デスティネーション オペランドはレジスタまたはメモリ ロケーションです。
  4. ソース オペランドはレジスタまたはメモリ ロケーションであり、デスティネーション オペランドはレジスタです。

そしてもちろん、異なるオペランド サイズ (8 ビット、16 ビット、32 ビットなど) には、これらのバリエーションがあります。

オペランドの 1 つがレジスタで、もう 1 つがメモリ ロケーションである場合、アセンブラがフォーム 3 と 4 のどちらを使用するかは明らかですが、両方のオペランドがレジスタである場合は、どちらのフォームも適用できます。プレフィックスは、.s使用するフォームをアセンブラーに指示します (逆アセンブリの場合は、使用されたフォームを示します)。

の具体的な例を見るとadcb %bl,%dh、次の 2 つの方法でエンコードできます。

10 de   adcb   %bl,%dh
12 f3   adcb.s %bl,%dh

最初のバイトは、使用される命令の形式を決定します。これについては後で説明します。2 番目のバイトは、ModR/M バイトとして知られているもので、使用されるアドレッシング モードとレジスタ オペランドを指定します。ModR/M バイトは、Mod (最上位 2 ビット)、REG (次の 3 ビット)、および R/M (最後の 3 ビット) の 3 つのフィールドに分割できます。

de: Mod=11, REG = 011, R/M = 110
f3: Mod=11, REG = 110, R/M = 011

オペランドの 1 つがメモリ ロケーションの場合、Mod フィールドと R/M フィールドは一緒にメモリ ロケーションの有効アドレスを決定しますが、そのオペランドが単なるレジスタの場合、Mod フィールドは 11 に設定され、R/M は値です。レジスターの。REG フィールドは明らかに他のレジスタを表します。

したがって、deバイトでは、R/M フィールドがdhレジスタを保持し、REG フィールドがblレジスタを保持します。また、f3バイトでは、R/M フィールドがblレジスタを保持し、REG フィールドがdhレジスタを保持します。(8 ビットのレジスタは、al、cl、dl、bl、ah、ch、dh、bh の順に 0 から 7 の数字としてエンコードされます)

最初のバイトに戻ると10、フォーム 3 エンコーディングを使用するように指示されます。この場合、ソース オペランドは常にレジスタであり (つまり、REG フィールドから取得されます)、デスティネーション オペランドはメモリ ロケーションまたはレジスタです (つまり、 Mod および R/M フィールドによって)。は12、フォーム 4 エンコーディングを使用するように指示します。ここで、オペランドは逆です。ソース オペランドは Mod および R/M フィールドによって決定され、デスティネーション オペランドは REG フィールドから取得されます。

そのため、レジスタが ModR/M バイトに格納されている位置がスワップされ、命令の最初のバイトで、どのオペランドがどこに格納されているかがわかります。

于 2013-05-25T10:32:24.690 に答える