|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近在看于渊同志写的书《Orange's 一个操作系统的实现》,第三章,遇到一个问题,在这里请教下大家.
第三章第一个程序。先把代码贴出来:
- ; ==========================================
- ; 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 ; GDT基地址
- ; GDT 选择子
- SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
- SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
- ; END of [SECTION .gdt]
- [SECTION .s16]
- [BITS 16]
- LABEL_BEGIN:
- mov ax, cs
- mov ds, ax
- mov es, ax
- mov ss, ax
- mov sp, 0100h
- ; 初始化 32 位代码段描述符
- xor eax, eax
- mov ax, cs
- shl eax, 4
- add eax, LABEL_SEG_CODE32
- mov word [LABEL_DESC_CODE32 + 2], ax
- shr eax, 16
- mov byte [LABEL_DESC_CODE32 + 4], al
- mov byte [LABEL_DESC_CODE32 + 7], ah
- ; 为加载 GDTR 作准备
- xor eax, eax
- mov ax, ds
- shl eax, 4
- add eax, LABEL_GDT ; eax <- gdt 基地址
- mov dword [GdtPtr + 2], eax ; [GdtPtr + 2] <- gdt 基地址
- ; 加载 GDTR
- lgdt [GdtPtr]
- ; 关中断
- cli
- ; 打开地址线A20
- in al, 92h
- or al, 00000010b
- out 92h, al
- ; 准备切换到保护模式
- mov eax, cr0
- or eax, 1
- mov cr0, eax
- ; 真正进入保护模式
- jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs,
- ; 并跳转到 Code32Selector:0 处
- ; END of [SECTION .s16]
- [SECTION .s32]; 32 位代码段. 由实模式跳入.
- [BITS 32]
- LABEL_SEG_CODE32:
- mov ax, SelectorVideo
- mov gs, ax ; 视频段选择子(目的)
- mov edi, (80 * 11 + 79) * 2 ; 屏幕第 11 行, 第 79 列。
- mov ah, 0Ch ; 0000: 黑底 1100: 红字
- mov al, 'P'
- mov [gs:edi], ax
- ; 到此停止
- jmp $
- SegCode32Len equ $ - LABEL_SEG_CODE32
- ; END of [SECTION .s32]
复制代码 我有个疑惑:我没看到任何赋值给cs寄存器的操作。不过程序中用cs寄存器中的值给其他几个寄存器赋值了。cs寄存器中的值是什么?谢谢
|
|