红色为批注,;$$为问题 ,待日后解决
%include "F:\虚拟机\玩转文件\pm.inc"
org 0100h ;之前存放.com文件的信息
jmp Code16
;GDT
[SECTION .des] ;段基址 段界限 属性
LABLE_GDT : Descriptor 0, 0, 0;必须有;$为啥必须有?$
LABLE_CODE32 : Descriptor 0, SEGCODE32-1, 4098H;非一致代码段
LABLE_DATA32 : Descriptor 0, SEGDATA32-1, 92H;
LABEL_DESC_VIDEO : Descriptor 0B8000h, 0ffffh, 92H; 显存首地址
GdtLen equ $-LABLE_GDT
;$equ的用法,GdtLen的值是什么时候固定了的?在编译的时候?$
GdtPtr dw GdtLen-1
dd 0
;GDT选择子 ;$选择子的结构怎么体现出来的,尤其是LDT的第一个描述符$
seclectorcode32 equ LABLE_CODE32 - LABLE_GDT
seclectordata32 equ LABLE_DATA32 - LABLE_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABLE_GDT
;数据段
[SECTION .data]
ALIGN 32
[BITS 32]
Data32 db "I AM chinese people"
SEGDATA32 equ $-Data32
[SECTION .code16] ;$什么作用?不仅是为了易于理解吧!$
[BITS 16] ;$有什么作用?告诉编译器位16位的代码?$
Code16:
MOV AX,CS ;$CS的值还是与上下文一致?是操作系统分配的? 编译阶段发生 MOV DS,AX ;$了什么? 形成可执行文件后整块进入内存还是按.com里的$
;$前缀信息分配代码空间和数据空间?没有之前的ORG会怎样?$
;$没有操作系统的话谁给可执行文件分配空间?【引导程序根据$
;$什么吧内核记载到相应内存】编译器怎么配合CPU工作的?$
;初始化 数据段 描述符
XOR EAX,EAX
mov ax,cs
SHL EAX,4
ADD EAX,Data32
mov [LABLE_DATA32+2],ax
shr eax,16
mov [LABLE_DATA32+4],al
mov [LABLE_DATA32+7],ah;36
;初始化 32位代码段 描述符
XOR EAX,EAX
mov ax,cs
SHL EAX,4
ADD EAX,Code32
mov [LABLE_CODE32+2],ax
shr eax,16
mov [LABLE_CODE32+4],al
mov [LABLE_CODE32+7],ah
;初始化 GDTR
xor eax,eax
mov ax,ds
shl eax,4
add eax,LABLE_GDT
mov dword [GdtPtr+2],eax
lgdt [GdtPtr]
Cli;关中断
;打开地址线A20
in al,92h
or al,00000010b
out 92h,al;
mov eax,cr0
or eax,1
mov cr0,eax;改变CR0的PE位,进入保护模式
;$CR0的结构,CR类寄存器与CPU的工作有什么联系?$
jmp dword seclectorcode32:0;CS=seclectorcode32,eip=0
;$既然进入保护模式了,又怎么会执行JMP命令呢?$
[SECTION .code32];----------------------------60
[BITS 32]
Code32:
xor eax,eax
mov ax,seclectordata32
mov ds,ax
xor edi,edi
mov edi,(80*10+0)*2;数据偏移,屏幕第10行,第 0 列
mov ax,SelectorVideo
mov gs, ax
mov ah,0Ch;0000 黑底,1100 红字
mov al,'P'
mov [gs:edi],ax
SEGCODE32 equ $-Code32