最近正在阅读《orange's,一个操作系统的实现》,真是相见恨晚啊,那么多年就没有一本真正深入浅出弄点代码让我们入门和实践一下的书,感谢作者于渊。
下面是第3章pmtest1.asm的全注释
总结执行过程如下:
- 初始化32位代码段的段基址,并存储到GDT中对应的描述符中
- 准备GDT的基地址,并通过LGDT指令加载到GDTR寄存器中
- cli关中断
- 打开地址线A20
- 将CR0寄存器的PE位置1,进入保护模式
- 已经进入保护模式,跳转到32位代码段继续执行
- 写显存
- game over
; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
; ==========================================
%include "pm.inc" ; 常量, 宏, 以及一些说明
org 07c00h
jmp LABEL_BEGIN
; 用户自定义段
[SECTION .gdt]
; GDT
; 段基址, 段界限 , 属性
LABEL_GDT: Descriptor 0, 0, 0 ; 空描述符
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW ; 显存首地址
; GDT 结束
GdtLen equ $ - LABEL_GDT ; GDT长度
GdtPtr dw GdtLen - 1 ; GDT界限
dd 0