1

x86asmからCコードエミュレーターを作成しています。パーサーの場合はブラケット解析までです。

QWORD PTR []

DWORD PTR []

WORD PTR []

BYTE PTR []

MOV X, []

LEA X, []

今のところ無視します。

MMWORD PTR[]

XMMWORD PTR[]

FWORD PTR []

TBYTE PTR []

角かっこに入れることができるすべての可能な数学算術が何であるか知りたいです

私が遭遇した最も複雑なものは.. [EBP+ECX*4-E0]

私が解析しなければならない理由は、に変換する E0ためです0x000000E040x00000004

私の知る限り、、、+可能である-か、可能であるか、またはドットはどうですか??*\/.

[]内部計算を取得するためにブラケットを含むすべての命令を分割する最良の方法を考えます。次に、内部の数学を1文字の区切り文字で分割し+-*ます。

私はそれらすべてを確実に手に入れたいですか?これらで分割は可能ですか?XOR / OR / AND / NOTはどうですか?

4

4 に答える 4

3

Mod R/M-Byte を構築するためのこれらの表は、16 ビットおよび 32 ビットのベースおよびインデックス レジスタを使用してアドレスを構築するために可能な組み合わせを示すのに役立つかもしれません。

Format of Postbyte(Mod R/M from Intel)
--------------------------------------
MM RRR MMM

MM  - Memeory addressing mode
RRR - Register operand address
MMM - Memoy operand address

RRR Register Names
Filds  8bit  16bit  32bit
000    AL     AX     EAX
001    CL     CX     ECX
010    DL     DX     EDX
011    Bl     BX     EBX
100    AH     SP     ESP
101    CH     BP     EBP
110    DH     SI     ESI
111    BH     DI     EDI

---

16bit memory (No 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
100   DS       [SI]      [SI+o8]     [SI+o16]
101   DS       [DI]      [DI+o8]     [SI+o16]
110   SS       [o16]     [BP+o8]     [BP+o16]
111   DS       [BX]      [BX+o8]     [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

32bit memory (Has 67h 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [EAX]     [EAX+o8]    [EAX+o32]
001   DS       [ECX]     [ECX+o8]    [ECX+o32]
010   DS       [EDX]     [EDX+o8]    [EDX+o32]
011   DS       [EBX]     [EBX+o8]    [EBX+o32]
100   SIB      [SIB]     [SIB+o8]    [SIB+o32]
101   SS       [o32]     [EBP+o8]    [EBP+o32]
110   DS       [ESI]     [ESI+o8]    [ESI+o32]
111   DS       [EDI]     [EDI+o8]    [EDI+o32]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

---

SIB is (Scale/Base/Index)
SS BBB III
Note: SIB address calculated as:
<sib address>=<Base>+<Index>*(2^(Scale))

Fild   Default Base
BBB    Sreg    Register   Note
000    DS      EAX
001    DS      ECX
010    DS      EDX
011    DS      EBX
100    SS      ESP
101    DS      o32        if MM=00 (Postbyte)
SS      EBP        if MM<>00 (Postbyte)
110    SS      ESI
111    DS      EDI

Fild  Index
III   register   Note
000   EAX
001   ECX
010   EDX
011   EBX
100              never Index SS can be 00
101   EBP
110   ESI
111   EDI

Fild Scale coefficient
SS   =2^(SS)
00   1
01   2
10   4
11   8
于 2014-02-01T10:10:09.007 に答える
2

括弧内はアドレス式です。Intel x86ファミリのプロセッサは、ベースレジスタの作成、オフセットの追加、2、4、または8でのスケーリングなど、特定のアドレス操作をサポートします。一部のアセンブラでは、ベースオフセット式の一部として構造体のフィールドへのドット参照が許可されます。ベースオフセットを計算することを除いて、括弧内の「数学」はアセンブリ時に行われる数学ではなく、実行時に計算される命令のアドレス部分のエンコードです。

于 2011-10-12T23:44:01.423 に答える
0

Intel Software Developer Manualsを読む必要があります。具体的には、セクション 3.7.5「オフセットの指定」で、これを行うには 2 つの方法があることがわかります。

  • 一般形Base + (Index * Scale) + Displacement
  • IP に相対: RIP + Displacement(64 ビット モードのみ)

次に、命令セットのリファレンスを調べて、各命令の可能性を見つけます。

あるいは、さまざまな逆アセンブラやエミュレータの既存の実装 ( distorm など) や、これをより便利な形式で文書化した他のプロジェクト( corkamiなど)を参照することもできます。

于 2014-02-01T10:29:24.033 に答える
-1

ウィキペディアのページの下部にある Intel のマニュアルを参照してください。これには、サポートされているさまざまなアドレッシング モードがすべて含まれているはずです。また、他のすべての命令の外観と機能が説明されています。

于 2011-10-13T00:24:09.820 に答える