/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
これは、「アドレス サイズ オーバーライド プレフィックス」に対応します。