最近どうっすか?

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

x86 ADD 0x00

随分と間を空けてしまった。
というわけでネタが無いときのためにx86アセンブラのコードを書いていこう。

オペコード:0x00
ニーモニック:ADD
オペランド:8Bit 汎用レジスタ(またはメモリアドレス), 8Bit汎用レジスタ

例:
ADD AL, BL
ADD [0x2000], AL

x86オペランドの指定方法はMod r/mという1バイトのデータとそれに続くデータで指定される。
1バイト(8ビット)の内訳は次の通り。

2ビット:Mod(4種のモード)
3ビット:reg(8種のレジスタ
3ビット:r/m(8種のレジスタまたはメモリアドレス指定)

Modとr/mの5ビットを使って32通りのレジスタまたはメモリアドレス(の計算方法)が表現できる。
実行モードでもう少し複雑になる。

マシン語の例:
ADD AL, BL → 0x00D8
ADD → 0x00 → 00000000
AL, BL → 0xD8 → 11011000
Mod=11, reg=011(BL), r/m=000(AL)

Mod=11はr/mフィールドが汎用レジスタを示すという意味

ADD → [0x2000], AL → 0x00060020
ADD → 0x00 → 00000000
[0x2000], AL → 0x060020 →00000110 00000000 00100000
Mod=00, reg=000(AL), r/m=110(DSレジスタ+16ビットのオフセット値)

Mod=00とr/mフィールドの110はMod r/mフィールドに続く値とDSレジスタの値を足したメモリアドレスを指定するという意味

こんな感じで良いだろうか?

ではでは。