5

objdump -dx86Linuxプログラムからの逆アセンブルで次の行を取得しています...

4000b0: ba 0e 00 00 00          mov $0xe,%edx

マシンコード「ba0e000000」が「mov$0xe、%edx」にどのようにマッピングされるかを理解しようとしています

手動移動では、即時32ビットは次のとおりです。

B8 + rd  ... MOV r32, imm32

つまり、「BA」ではなく「B8」

実際、MOVオペコードはどれも「BA」ではありません。

誰かが「ba0e0000 00」を分解し、「mov $ 0xe、%edx」に到達する方法をビット単位で説明できるとしたら、それが最も役立ちます。

4

1 に答える 1

12

オペコード 0xba は「MOV EDX, imm32」です。混乱は、0xba のような短い 1 バイトのオペコードであっても、命令エンコーディングを提示する際にあまりにも多くのショートカットを使用する IA マニュアルに起因します。

IA マニュアルには、次のように記載されています。

B8+ rd MOV r32, imm32 OI 有効 有効 imm32 を r32 に移動します。

つまり、0xb8 を取得し、特定の r32 のエンコーディングを追加して、最終的なオペコード バイトを取得します。

特定の r32 エンコーディングは、ボリューム 2A の表 2-2 にあります。

EAX 000 = 0
 ECX 001 = 1
 EDX 010 = 2
 EBX011=3
 ESP 100 = 4
 EBP 101 = 5
 ESI 110 = 6
 EDI 111 = 7

Intel リファレンスの Volume 2C の付録 A も、このような状況で役立ちます。この付録では、1、2、および 3 バイト命令のオペコード マップを提供します。あなたの場合、シングルバイトオペコード0xBAを調べると、命令はレジスタrDXへのMOV即時であり、幅「r」は他の要因に依存します。

于 2012-06-21T03:00:42.773 に答える