最終更新:2015-07-17 (金) 07:15:04 (1560d)  

ModR/M はてなブックマークを見る
Top / ModR / M

Mode Register/Memory

概要

  • x86では、二つのオペランドがあるレジスターを扱う命令は、このバイトをパラメーターとしてオペコードの直後に置く。
  • 片方はレジスタに固定、もう片方はレジスタまたはメモリが選択可能
  • レジスターを使う場合はオフセットを追加することができる

x86アセンブラ

構造

  • 76543210
    Modreg/opcodeR/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 メモリ
  • 命令により異なるが一般的には
    意味
    000eax(またはal、ax、mm0、xmm0)
    001ecx(またはcl、cx、mm1、xmm1)
    010edx(またはdl、dx、mm2、xmm2)
    011ebx(またはbl、bx、mm3、xmm3)
    100esp(またはah、sp、mm4、xmm4)
    101ebp(またはch、bp、mm5、xmm5)
    110esi(またはdh、si、mm6、xmm6)
    111ebi(またはbh、di、mm7、xmm7)

SIB

関連

参考