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)