Intel64 の ModR/M の仕組みをやっと理解した

Intel 64 and IA-32 Architectures Software Developer's Manual を読んでも ModR/M や SIB が理解できない。
x86系CPUのネイティブコードを解析する(2/3):CodeZine を読んでやっと理解できた。日本語でまとまっているのは大変ありがたい。


例えば以下のアセンブリアセンブルする。

(movq (& rbx #x30) rcx)


まず上に挙げた Intel のリファレンスで MOV を調べる。するといくつかのタイプが列挙されているのが分かる。
今回のケースは「 Move r64 to r/m64 」に該当するので以下の行が見つかるはず。

REX.W + 89/r MOV r/m64, r64


ここで分かる事は

  • #x48 (REX.W) が必要
  • MOV の opcode は #x89

であること。


次に ModR/M の Mod を決める。今回は displacement #x30 を指定した Effective Address なので disp8 の Mod = #b01 となる。
Reg は rcx だから#b001 (レジスタ番号1)。R/M は rbx なので #b011(レジスタ番号3) 。
結局 ModR/M 全体では #b01001011 = #x4b となる。


最後に displacement をそのまま放り込んで #x30 。
というわけでアセンブル結果は以下のようになる。

(#x48 #x89 #x4b #x30)