(AT&T と Intel の両方の構文で) を.text
使用して一部のバイナリのセクションを逆アセンブルすると、、、または.objdump
.s
cmpb.s %bh,%ch
sbbl.s %edi,%edi
adcb.s %bl,%dh
サフィックスには有効/有用な意味がありますか.s
(おそらくサフィックスとしてでさえありません)、またはこれは、命令のシーケンスであるかのように、一部のデータ/パディングを逆アセンブルするアーティファクトですか? ありがとうございました。
サフィックスの意味を理解する.s
には、x86 命令がどのようにエンコードされるかを理解する必要があります。adc
例として取り上げると、オペランドが取ることができる主な形式が 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 バイトに格納されている位置がスワップされ、命令の最初のバイトで、どのオペランドがどこに格納されているかがわかります。