[书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT
进入保护模式;初始化全局描述符表,通过GDT进入代码段、数据段、堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码 ; 设置堆栈段和栈指针 ; 0x07c00以此为界限,mbr代码段cs:ip向上,mbr堆栈段ss:sp向下 mov ax, cs mov ss, ax mov sp, 0x7c00 ; 计算gdt所在的逻辑段地址 ; 32位忽略高位0,折算为20位,即ds:bx形式(ds*16 + bx) mov ax, [cs:gdt_base + 0x7c00] ; 低16位 mov dx, [cs:gdt_base + 0x7c00 + 2] ; 高16位 mov bx, 16 div bx mov ds, ax ; 商为逻辑段地址 mov bx, dx ; 余数为偏移地址 ; 创建gdt第#0号描述符 ; 处理器规定,gdt中第一个描述符必须是空描述符 mov dword [bx], 0x00000000 mov dword [bx+0x04], 0 ; 创建gdt第#1号描述符,保护模式下的代码段描述符 ; 该段:线性基地址为0x0000 7c00,段界限为0x0 01FF(即段长512字节),粒度为字节(G=0) ; 属于存储器的段(S=1),是32位的段(D=1),目前位于内存中(P=1)