12
77f4bcbc 8945fc          mov     dword ptr [ebp-4],eax

そして、ここにルールがあります:

88  /r   MOV r/m8,r8       2/2           Move byte register to r/m byte
89  /r   MOV r/m16,r16     2/2           Move word register to r/m word
89  /r   MOV r/m32,r32     2/2           Move dword register to r/m dword

解釈8945fcする方法はmov dword ptr [ebp-4],eax

4

4 に答える 4

28

ここに3バイトの命令があります:8945fc。最初のバイトはオペコードバイトです。表で調べると、これはMOV命令であり、Mod R/Mバイトを使用していることがわかります。Mod R/Mバイトのレイアウトは次のとおりです。

 7  6   5  4  3   2  1  0
+-----+---------+---------+
| Mod |   Reg   |   R/M   | 
+-----+---------+---------+

命令の2番目のバイトを見てみましょう。0x45はバイナリで01.000.101です。したがって、Modは01、Regは000、R/Mは101です。

参考文献を見ると、たとえばここでは、Mod=01とR/M=101の組み合わせが[EBP+sbyte]オペランドに対応していることがわかります。「sbyte」は、3番目のバイトである0xFCにエンコードされた8ビットの符号付き変位です。変位は署名されているため、そのような数値、つまり-4として解釈する必要があります。

命令の横にある「/r」の注記は、レジスタ(2番目)のオペランドが命令のRegフィールドによって指定されていることを示しています。Reg=000はal/ax/eaxです。デフォルトで32ビットモードを想定すると、これはeaxを意味します。

上記のすべてを組み立てると、

MOV [EBP-4], EAX
于 2011-05-16T16:08:00.300 に答える
2

89オペコード
45は送信元と送信先をエンコードします
fcオフセット (-4)

于 2011-05-16T16:01:52.940 に答える
1

mov dword ptr [ebp-4],eaxを探します。8 ビットのコードがあります。簡単に取得できます。最初の 6 ビットを指定するか、mov コマンド用に記憶し、LSB に宛先ビットを追加する必要があります (D ) ここで、宛先にレジスタがある場合は d=1、レジスタがソースにある場合は d=0 です。ここで、レジスタ eax はソース側にあるため、0 を追加し、次にワード ビット (W ビット) と呼ばれる最後のビットを追加する必要があります。 W ビット = 16/32 ビット レジスタがある場合は 1、8 ビット レジスタがある場合は 0 である宛先ビットの後に LSB 側に追加されるため、コマンド「mov dword ptr [ebp-4],eax」に従って
d ビット = 0 および w ビット = 1 の場合、8 ビットのオペコードを取得したら、MOD(R/M) フィールドを見つける必要があります。そのためには、3 つのことを見つけなければなりません。1) mod 値 2) レジスタ値 3) ここでの R/M 値の形式は +-----+---------+---------+ | モッド | 登録 | R/M | +-----+---------+---------+ 上記の回答で述べたように、コマンドmov dword ptr [ebp-4],eax そこに 8をチェックインします-4 に従ったビット変位、次に mod 値 =01 MOD 値: 変位なしの場合は 00 8 ビット変位の場合は 01 16 ビット変位の場合は 10 レジスタ間転送の場合は 11

したがって、ここでは mod=01 の場合、reg eax の値は 000 で、(R/M) の値は 101 です。

したがって、R/M フィールドの 8 ビットは

01000101 この説明がお役に立てば幸いです

于 2013-11-09T10:38:11.877 に答える
1

独自の逆アセンブラを作成する場合は、次のものが必要です

簡単な要約については、こちらをご覧ください

于 2011-05-16T16:02:36.030 に答える