16bitリアルモードでの各種設定

x86の16bitリアルモードにおける各機能の利用方法について記録しています。

A20ゲート

キーボードコントローラーを使わない方法(Prot A)

MOV	AX,0
IN	AL,0x92
OR	AL,0x02
OUT	0x92,AL

BIOSでの文字表示で色を変えたい

画面モードを変える。

MOV		AX,0;念のため
MOV		AL,0x12
INT		0x10

あとは、BLにカラーコードを入れて文字表示割り込みを起こす。

0x66 Prefix

アセンブリを書くときなどに、オペランドサイズをオーバーライドしたい場合がある。 例えば、32ビットプロテクトモードにジャンプする際のljmplはそのままljmpと書くと32ビットセグメントセレクタとなる。 一方で、ljmp $code:addrとかくと、$codeが16ビット値として格納される場合がある。 そのような場合に対応するには.byte 0x66; ljmp $code:addrと書くか、そもそも以下のようにオペランドとオペコードを分けて書くと良い。

.byte   0x66, 0xEA
.long   address
.word   cs_selector

なお、NetBSDのreal_to_protではljmp $selector, $addressと書いている。 こう書いても動くかもしれない(未確認)。