BIOS は 16 ビット マシン用に設計されました。ただし、プロテクト モードで BIOS 割り込みを呼び出すオプションは 3 つあります。
- リアル モードに切り替えて、プロテクト モードに再度入ります (最も簡単な方法)。
- v86 モードを使用します (64 ビット long モードでは使用できません)。
- 独自の 16 ビット x86 プロセッサ エミュレータを作成します (最も困難な方法)。
私のオペレーティング システムでは、VBE と BIOS を介したディスク アクセスに最初のアプローチを使用しました。
私のオペレーティングシステムでこの目的に使用されるコード:
;______________________________________________________________________________________________________
;Switch to 16-bit real Mode
;IN/OUT: nothing
go16:
[BITS 32]
cli ;Clear interrupts
pop edx ;save return location in edx
jmp 0x20:PM16 ;Load CS with selector 0x20
;For go to 16-bit real mode, first we have to go to 16-bit protected mode
[BITS 16]
PM16:
mov ax, 0x28 ;0x28 is 16-bit protected mode selector.
mov ss, ax
mov ds, ax
mov es, ax
mov gs, ax
mov fs, ax
mov sp, 0x7c00+0x200 ;Stack hase base at 0x7c00+0x200
mov eax, cr0
and eax, 0xfffffffe ;Clear protected enable bit in cr0
mov cr0, eax
jmp 0x50:realMode ;Load CS and IP
realMode:
;Load segment registers with 16-bit Values.
mov ax, 0x50
mov ds, ax
mov fs, ax
mov gs, ax
mov ax, 0
mov ss, ax
mov ax, 0
mov es, ax
mov sp, 0x7c00+0x200
cli
lidt[.idtR] ;Load real mode interrupt vector table
sti
push 0x50 ;New CS
push dx ;New IP (saved in edx)
retf ;Load CS, IP and Start real mode
;Real mode interrupt vector table
.idtR: dw 0xffff ;Limit
dd 0 ;Base