13

のエンコーディング

call qword ptr [rax]
call qword ptr [rcx]

FF 10
FF 11

最後の桁 (0/1) が (レジスター番号) から来ていることはわかりますが、下から 2 番目の桁 (1) がどこから来ているのかを突き止めようとしています。AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions page 56 によると、

"/digit - ModRM バイトが 1 つのレジスタまたはメモリ (r/m) オペランドのみを指定することを示します。数字は ModRM reg フィールドによって指定され、命令オペコード拡張として使用されます。有効な数字の値の範囲は 0 ~ 7 です。 "

同等の Intel ドキュメントは、同様のことを述べており、callレジスタを介して次のようにエンコードされるように指定されています。

FF /2

そして...それが何を意味するのか、または仕様の2が最終結果の上位1桁にどのように接続するのかわかりません。どこかで利用できる別の言い回しの説明はありますか?

4

3 に答える 3

14

ModR/M バイトには 3 つのフィールドがあります。

bit 7 & bit 6 = mod
bit 5 through bit 3 = reg = /digit
bit 2 through bit 0 = r/m

これはFigure 2-1. Intel 64 and IA-32 Architectures Instruction Format、Vol。の2A Intel® 64 and IA-32 Architectures Software Developer’s Manual

だから、そこに:

  0x10= 00.010.000(mod=0, reg/digit=2, r/m=0)

  0x11= 00.010.001(mod=0, reg/digit=2, r/m=1)。

于 2013-03-19T22:28:49.537 に答える
9

Intel® 64 and IA-32 Architectures Developer's Manual: Combined Volumes、Volume 2: Instruction Reference Set、Chapter 2: Instruction Format、2.1.5 Addressing-Mode Encoding of ModR/M and SIB バイト:

表 2-2。ModR/M バイトを使用した 32 ビット アドレッシング フォーム

r8(/r) AL CL DL BL AH CH DH BH
r16(/r) AX CX DX BX SP BP SI DI
r32(/r) EAX ECX EDX EBX ESP EBP ESI EDI
mm(/r) MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7
xmm(/r) XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
(10 進数) /桁 (オペコード) 0 ​​1 2 3 4 5 6 7
(バイナリで) REG = 000 001 010 011 100 101 110 111
実効アドレス Mod R/M ModR/M バイトの値 (16 進数)
[EAX] 00 000 00 08 10 18 20 28 30 38
[ECX] 001 01 09 11 19 21 29 31 39
[EDX] 010 02 0A 12 1A 22 2A 32 3A
[EBX] 011 03 0B 13 1B 23 2B 33 3B
[--][--] *1 100 04 0C 14 1C 24 2C 34 3C
disp32 ※2 101 05 0D 15 1D 25 2D 35 3D
[ESI] 110 06 0E 16 1E 26 2E 36 3E
[EDI] 111 07 0F 17 1F 27 2F 37 3F
[EAX]+disp8 *3 01 000 40 48 50 58 60 68 70 78
[ECX]+disp8 001 41 49 51 59 61 69 71 79
[EDX]+disp8 010 42 4A 52 5A 62 6A 72 7A
[EBX]+disp8 011 43 4B 53 5B 63 6B 73 7B
[--][--]+disp8 100 44 4C 54 5C 64 6C 74 7C
[EBP]+disp8 101 45 4D 55 5D 65 6D 75 7D
[ESI]+disp8 110 46 4E 56 5E 66 6E 76 7E
[EDI]+disp8 111 47 4F 57 5F 67 6F 77 7F
[EAX]+disp32 10 000 80 88 90 98 A0 A8 B0 B8
[ECX]+disp32 001 81 89 91 99 A1 A9 B1 B9
[EDX]+disp32 010 82 8A 92 9A A2 AA B2 BA
[EBX]+disp32 011 83 8B 93 9B A3 AB B3 BB
[--][--]+disp32 100 84 8C 94 9C A4 AC B4 BC
[EBP]+disp32 101 85 8D 95 9D A5 AD B5 BD
[ESI]+disp32 110 86 8E 96 9E A6 AE B6 BE
[EDI]+disp32 111 87 8F 97 9F A7 AF B7 BF
EAX/AX/AL/MM0/XMM0 11 000 C0 C8 D0 D8 E0 E8 F0 F8
ECX/CX/CL/MM/XMM1 001 C1 C9 D1 D9 E1 E9 F1 F9
EDX/DX/DL/MM2/XMM2 010 C2 CA D2 DA E2 EA F2 FA
EBX/BX/BL/MM3/XMM3 011 C3 CB D3 DB E3 EB F3 FB
ESP/SP/AH/MM4/XMM4 100 C4 CC D4 DC E4 EC F4 FC
EBP/BP/CH/MM5/XMM5 101 C5 CD D5 DD E5 ED F5 FD
ESI/SI/DH/MM6/XMM6 110 C6 CE D6 DE E6 EE F6 FE
EDI/DI/BH/MM7/XMM7 111 C7 CF D7 DF E7 EF F7 FF
ノート:
1. [--][--] 命名法は、SIB が ModR/M バイトに続くことを意味します。
2. disp32 命名法は、ModR/M バイト (または SIB
バイトが存在する場合)、それがインデックスに追加されます。
3. disp8 命名法は、ModR/M バイト (または SIB
バイトが存在する場合)、それは符号拡張され、インデックスに追加されます。
于 2013-03-19T22:25:38.643 に答える
5

/2インテル ドキュメントのボリューム 2A の表 2-2の平均ルックアップ (表とボリュームの 2 は、そことは関係ありません/2)。左上のテーブルには があり/digitます。右側の列に移動して、 を見つけます/2。それに戻ります。

ここで、call命令定義を見るOp/Enと、「オペランド エンコーディング」が表示されます。

Op/En       Operand 1       Operand 2       Operand 3       Operand 4
D           Offset          NA              NA              NA
M           ModRM:r/m (r)   NA              NA              NA

また、最初の表の署名にも注意してcallください。たとえば、これはrax使用法に対応する 64 ビットです。

Opcode    Instruction   Op/En
FF /2     CALL r/m64    M

これは、以下の「オペランド エンコーディング」(Op/En) テーブルを参照するMように指示します。M

Op/En       Operand 1       Operand 2     Operand 3       Operand 4
M           ModRM:r/m (r)   NA            NA              NA

したがって、オペランド 1 はModRM:r/m (r)です。(r)オペランドが読み取られる (書き込まれない)ことを意味します。ModRM:r/m は、オペランドに r/m 値を持つ ModRM バイトがあることを示します。rinr/mは「登録」、inはm「記憶」を意味します。

/2表 2-2の列に戻ると、010と書かれている行のすぐ上に がありますREG。これは、ModRM の中間の「reg」セグメントを参照しています。

thisによると、次のようになります。

mod     description (relevant to us)
00      register indirect addressing mode
01      one-byte signed displacement follows addressing mode byte(s)
10      four-byte signed displacement follows addressing mode byte(s)
11      register addressing mode

を使用しているので[rax]、レジスタ間接アドレッシング モードです00

これで、mod と reg ができました。今度は、ModRM バイトを完成させるために r/m が必要です。

Web 上のの場所から: r/m フィールドは、どのレジスターが使用されているかをエンコードします。表 2-2 と列に戻り、左側の Mod ボックス/2と一致させ、行 ( で使用されているものと同じ) を使用すると、最終的に になります。同様に、行をたどると( の場合と同じ)、 が得られます。これにより、次のことがわかります。00EAXRAXcall [rax]10ECXRCXcall [rcx]11

FF 10       call [rax]
FF 11       call [rcx]

表には r/m 値も示されていることに注意してください: 000forraxおよび001for rcx。これにより、最終的な ModRM バイトが得られます。

ModRM         for        hex
00.010.000    rax        10
00.010.001    rcx        11

を行う場合は、16 進数call [eax]で接頭辞が付けられることにも注意してください。67

67 FF 01

これは、「アドレス サイズ オーバーライド プレフィックス」に対応します。

于 2021-01-29T07:15:12.667 に答える