/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 バイトがあることを示します。r
inr/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
と一致させ、行 ( で使用されているものと同じ) を使用すると、最終的に になります。同様に、行をたどると( の場合と同じ)、 が得られます。これにより、次のことがわかります。00
EAX
RAX
call [rax]
10
ECX
RCX
call [rcx]
11
FF 10 call [rax]
FF 11 call [rcx]
表には r/m 値も示されていることに注意してください: 000
forrax
および001
for rcx
。これにより、最終的な ModRM バイトが得られます。
ModRM for hex
00.010.000 rax 10
00.010.001 rcx 11
を行う場合は、16 進数call [eax]
で接頭辞が付けられることにも注意してください。67
67 FF 01
これは、「アドレス サイズ オーバーライド プレフィックス」に対応します。