最近どうっすか?

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

x86 ADD 0x01

とりあえず間違ってるかもしれないから随時修正していこう。

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

例:
ADD AX, BX
ADD [0x2000], AX

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

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

マシン語の例:
ADD AX, BX → 0x01D8
ADD → 0x01 → 00000001
AX, BX → 0xD8 → 11011000
Mod=11, reg=011(BX), r/m=000(AX)

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


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

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

ではでは。