1.
org 0x7C00
jmp start
GDT_BEG:
DESC_SG_NULL dd 0x00000000, 0x00000000
DESC_SG_CODE dd 0x7C0001FF, 0x00409800
DESC_SG_VIDEO dd 0x8000FFFF, 0x0040920B
DESC_SG_STACK dd 0x00007A00, 0x00409600
GDT_END:
GDT_SIZE_DWORD equ (GDT_END - GDT_BEG) / 4
GDTR: ; 以下48位内容需要加载到全局描述符表寄存器gdtr中
GDT_BOUND dw GDT_END - GDT_BEG - 1 ; 低16位是GDT的界限(即GDT总共多少字节)
; 如果把GDT看做以字节为单位的数组,则下标从0开始
; 所以该项为GDT总字节数减1
; 本程序总共有4个描述符,GDT每个表项都占8字节
GDT_BASE dd 0x7E00 ; GDT加载在内存中的起始物理地址
; 由于在加载GDTR时还没有进入保护模式,因此只能用20位地址
; 这里就只能用32位来表示20位地址了
; 因此在进入保护模式前只能将GDT加载到1MB的内存空间中
; 在进入保护模式之后可以再将GDT移动到其它位置
; 由于MBR位于0x7C00开始的512字节空间中了
; 因此就将GDT放在后面一个新的512字节处(7E00H = 7C00H + 512)
PORT_FAST_A20 equ 0x92 ; 快速设置A20地址线的端口
GATE_ALT_A20 equ 0x02 ; 开启A20地址线的位掩码(门控),也称作A20替代门控
; 即该8位端口的1号位置1即可打开A20地址线
GAT