法楽日記

デジタル散策記&マインド探訪記

X86 で Real Mode / Protected Mode / Long Mode を判別するためのバイナリコード

X86 が Real Mode / Protected Mode / Long Mode のいずれで動作しているかを確認するために、下記のバイナリコードを利用しています。事前に RAX を 0 にしておけば、HLT 時の RAX の値で動作モードを判別できます。もっとよいバイナリコードがあれば知りたいです。

利用しているバイナリコード

33 C0 48 83 E8 01 F4

Real Mode (8086) では次のように解釈されます。

33 C0           XOR AX, AX
48              DEC AX
83 E8 01        SUB AX, 1
F4              HLT

Result: AX = -2 (FFFEh)

Protected Mode (i386) では次のように解釈されます。

33 C0           XOR EAX, EAX
48              DEC EAX
83 E8 01        SUB EAX, 1
F4              HLT

Result: EAX = -2 (FFFFFFFEh)

Long Mode (amd64) では次のように解釈されます。

33 C0           XOR EAX, EAX
48 83 E8 01     SUB RAX, 1
F4              HLT

Result: RAX = -1 (FFFFFFFFFFFFFFFFh)

ご覧のように、動作モードによってバイナリコードの解釈が変化することを利用しています。特に 48h の解釈が 8086 / i386 では DEC 、amd64 では REX.W と変化するところが味噌でした。