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と書いている。
こう書いても動くかもしれない(未確認)。