最終更新:2015-07-17 (金) 07:15:04 (3204d)
ModR/M
Mode Register/Memory
概要
- x86では、二つのオペランドがあるレジスターを扱う命令は、このバイトをパラメーターとしてオペコードの直後に置く。
- 片方はレジスタに固定、もう片方はレジスタまたはメモリが選択可能
- レジスターを使う場合はオフセットを追加することができる
x86アセンブラ
構造
7 6 5 4 3 2 1 0 Mod reg/opcode R/M - ModフィールドとR/Mフィールドの組み合わせで実効アドレス指定(とレジスタ指定)ができる
- Reg/Opcodeフィールドは、もう一方のオペランドになるレジスタを指定するフィールド
- オペランドを1つしか取らない命令の場合、Reg/Opcodeフィールドはなくてもいいことになるが、実際にはオペコードを拡張するために使われている。
- 例えばmul命令のオペコード「F6 /4」の/4の部分やdiv命令のオペコード「F6 /6」の/6の部分がそうで、mul命令もdiv命令も基本オペコードはF6で、拡張オペコード(つまりModR/MバイトのReg/Opcodeフィールド)で両者は区別される
Mod
- アドレッシングモード
値 意味 00 レジスタのみで実効アドレスを指定するモード。 レジスタ + レジスタ 01 レジスタおよび8ビットのディスプレースメントで実効アドレスを指定するモード。 レジスタ + disp8 10 レジスタおよび32ビットのディスプレースメントで実効アドレスを指定するモード。 レジスタ + disp32 11 レジスタ値を指定するモード。 レジスタ
reg/opcodeとr/m
- レジスタを指定するフィールド
- Reg/Opcode : レジスタまたはオペコード
- r/m : レジスタ or メモリ
- 命令により異なるが一般的には
値 意味 000 eax(またはal、ax、mm0、xmm0) 001 ecx(またはcl、cx、mm1、xmm1) 010 edx(またはdl、dx、mm2、xmm2) 011 ebx(またはbl、bx、mm3、xmm3) 100 esp(またはah、sp、mm4、xmm4) 101 ebp(またはch、bp、mm5、xmm5) 110 esi(またはdh、si、mm6、xmm6) 111 ebi(またはbh、di、mm7、xmm7)