最近どうっすか?

コンピュータをメインに技術系の話題について書いていけたらいいなぁ。

x86アセンブラのオペランド

x86アセンブラについて概要的なことを書かないとダメだと気づいた。
っていうか自分がわかっていないことが判明。

アセンブラの基本形はx86にかかわらず大体こんな感じ。

オペコード オペランド

これはOK。
で、オペコードは命令の種類で問題ないとして。。。

オペランドの形の種類として

2個の引数はレジスタ(reg)、メモリアドレス(mem)、即値(imm)の組み合わせとなる。
オペランドのパターンは次のようになる。

  • ADD reg, reg
  • ADD reg, mem
  • ADD reg, imm
  • ADD mem, reg
  • ADD mem, imm

しかし、これらのパターンも引数もデータ長が8bit, 16bit, 32bitのデータ長をとるため、実際にはもっと複雑(多種)となる。

そして、実際にアセンブラのコードをバイナリに変換する場合、次のようなビット列になって変換される。

オペコード:8bit
Mod r/m:8bit
追加のオペランド:8bit以上

Mod r/mバイトの構成は

  • mod:2bit
  • reg:3bit
  • r/m:3bit

modのパターンによってr/mの3bitが表す意味が決まるので実際には5bitで32通りのオペランド表現ができる。

とりあえず、ここまでは分かった。

ではでは。