4. プロテクトモード
4.1 プロテクトモードへの移行
-
モード移行の手順
- CRレジスタ0の最下位ビット(PE(プロテクションイネーブル)ビット)を1にセットすることでCPUの動作モードがプロテクトモードになる
mov eax, cr0 or eax, 1 mov cr0, eax
- モード移行の前に以下の準備をしておかなくてはならない
- セグメントの設定
- 割り込みの設定
- アドレス制限の解除
4.2 リアルモードへの移行
-
モード移行の手順
- CRレジスタ0の最下位ビット(PE(プロテクションイネーブル)ビット)を0にセットすることでCPUの動作モードがプロテクトモードになる
mov eax, cr0 or eax, 0fffffffeh mov cr0, eax
- モード移行の前(と後)に以下の準備をしておかなくてはならない
- 割り込みの設定
- セグメントの設定
- アドレス制限の設定
-
リアルモードへ移行するケース
- MS-DOS上のアプリケーションソフトウェアを作る場合で、大規模なプログラムを効率的に開発するため、プロテクトモードに移行して作業を行うことがあるが、実行終了後にMS-DOSに制御を戻したり、ファイルの読み書きのためにMS-DOSを呼び出す時にはリアルモードに戻る必要がある(NS-DOSのシステムコールはリアルモードでしか実行できない)
-
286でのリアルモードへの移行
- リアルモードへの移行機能がないため、リセット用の外部回路を使ってリアルモードへの復帰を実現する
- リアルモードへの移行のためのリセットでは、ある特定の物理アドレスのメモリに故意のリセットであることを示す値を書き込んでおく
4.3 モード移行プログラム
- アセンブラの擬似命令
- MASMやTASMでは、無指定の状態では8086の命令のみを受け付けるようになっているため、386以降に追加されたレジスタや拡張された命令を受け付けるようにするには、擬似命令による宣言が必要
- 通常のアプリケーションソフトウェアで利用される一般命令を使用する場合
- .386擬似命令で宣言
- オペレーティングシステムで使用する特殊命令を使用する場合
- .386p擬似命令で宣言
- 通常のアプリケーションソフトウェアで利用される一般命令を使用する場合
- MASMやTASMでは、無指定の状態では8086の命令のみを受け付けるようになっているため、386以降に追加されたレジスタや拡張された命令を受け付けるようにするには、擬似命令による宣言が必要
- プロテクトモード移行関数
- 486はパイプライン処理(マシン語プログラムの読み出し、解釈、実行を並行して行うこと)を行なっているため、プロテクトモードに移行したにも関わらず、リアルモード状態で解釈されたものが紛れている可能性がある
- JMP命令によってこれを無効にしている
.386p
_TEXT segment byte public use16 'CODE'
assume cs:_TEXT
public _RealToProto
_RealToProto proc near
push bp
move bp, sp
;
cli # 割り込みを禁止
mov eax, cr0
or eax, 1
mov cr0, eax
;
jmp flush_q1 # パイプラインに先読みした命令をクリアする
flush_q1:
pop bp
ret
push bp
_RealToProto endp
- リアルモード移行関数
public _ProtoToReal
_ProtoToReal proc near
push bp
move bp, sp
;
mov eax, cr0
or eax, 0fffffffeh
mov cr0, eax
;
jmp flush_q2 # パイプラインに先読みした命令をクリアする
flush_q2:
pop bp
ret
push bp
_ProtoToReal endp
_TEXT ends
end