本文主要是介绍内核雏形——跳入保护模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
源于《自己动手写操作系统》
内核已经被我们加载进内存了,现在要跳入保护模式了~在拉出.asm文件之前,有几个inc文件必须说明一下
lib.inc
; ------------------------------------------------------------------------
; 显示 AL 中的数字
; ------------------------------------------------------------------------
DispAL:push ecxpush edxpush edimov edi, [dwDispPos]mov ah, 0Fh ; 0000b: 黑底 1111b: 白字mov dl, alshr al, 4mov ecx, 2
.begin:and al, 01111bcmp al, 9ja .1add al, '0'jmp .2
.1:sub al, 0Ahadd al, 'A'
.2:mov [gs:edi], axadd edi, 2mov al, dlloop .begin;add edi, 2mov [dwDispPos], edipop edipop edxpop ecxret
; DispAL 结束-------------------------------------------------------------; ------------------------------------------------------------------------
; 显示一个整形数
; ------------------------------------------------------------------------
DispInt:mov eax, [esp + 4]shr eax, 24call DispALmov eax, [esp + 4]shr eax, 16call DispALmov eax, [esp + 4]shr eax, 8call DispALmov eax, [esp + 4]call DispALmov ah, 07h ; 0000b: 黑底 0111b: 灰字mov al, 'h'push edimov edi, [dwDispPos]mov [gs:edi], axadd edi, 4mov [dwDispPos], edipop ediret
; DispInt 结束------------------------------------------------------------; ------------------------------------------------------------------------
; 显示一个字符串
; ------------------------------------------------------------------------
DispStr:push ebpmov ebp, esppush ebxpush esipush edimov esi, [ebp + 8] ; pszInfomov edi, [dwDispPos]mov ah, 0Fh
.1:lodsbtest al, aljz .2cmp al, 0Ah ; 是回车吗?jnz .3push eaxmov eax, edimov bl, 160div bland eax, 0FFhinc eaxmov bl, 160mul blmov edi, eaxpop eaxjmp .1
.3:mov [gs:edi], axadd edi, 2jmp .1.2:mov [dwDispPos], edipop edipop esipop ebxpop ebpret
; DispStr 结束------------------------------------------------------------; ------------------------------------------------------------------------
; 换行
; ------------------------------------------------------------------------
DispReturn:push szReturncall DispStr ;printf("\n");add esp, 4ret
; DispReturn 结束---------------------------------------------------------; ------------------------------------------------------------------------
; 内存拷贝,仿 memcpy
; ------------------------------------------------------------------------
; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);
; ------------------------------------------------------------------------
MemCpy:push ebpmov ebp, esppush esipush edipush ecxmov edi, [ebp + 8] ; Destinationmov esi, [ebp + 12] ; Sourcemov ecx, [ebp + 16] ; Counter
.1:cmp ecx, 0 ; 判断计数器jz .2 ; 计数器为零时跳出mov al, [ds:esi] ; ┓inc esi ; ┃; ┣ 逐字节移动mov byte [es:edi], al ; ┃inc edi ; ┛dec ecx ; 计数器减一jmp .1 ; 循环
.2:mov eax, [ebp + 8] ; 返回值pop ecxpop edipop esimov esp, ebppop ebpret ; 函数结束,返回
; MemCpy 结束-------------------------------------------------------------
BaseOfLoader equ 09000h ; LOADER.BIN 被加载到的位置 ---- 段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被加载到的位置 ---- 偏移地址BaseOfLoaderPhyAddr equ BaseOfLoader * 10h ; LOADER.BIN 被加载到的位置 ---- 物理地址 (= BaseOfLoader * 10h)BaseOfKernelFile equ 08000h ; KERNEL.BIN 被加载到的位置 ---- 段地址
OffsetOfKernelFile equ 0h ; KERNEL.BIN 被加载到的位置 ---- 偏移地址
loader.asm
org 0100hjmp LABEL_START ; Start; 下面是 FAT12 磁盘的头, 之所以包含它是因为下面用到了磁盘的一些信息
%include "fat12hdr.inc"
%include "load.inc"
%include "pm.inc"; GDT ------------------------------------------------------------------------------------------------------------------------------------------------------------
; 段基址 段界限 , 属性
LABEL_GDT: Descriptor
这篇关于内核雏形——跳入保护模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!