hlly1--

红色为批注,;$$为问题  ,待日后解决

%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;改变CR0PE位,进入保护模式

;$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行,第 

 

 

 mov ax,SelectorVideo

 mov gs, ax

 

 mov ah,0Ch;0000  黑底,1100  红字

 mov al,'P'

 

 mov [gs:edi],ax

 

 

 

 SEGCODE32 equ $-Code32

 

你可能感兴趣的:(自学<动手写操作系统>)