一个进入保护模式加载引导程序的BOOTLOADER
; haribote-ipl
; TAB=4
CYLS EQU 10 ; 偳偙傑偱撉傒崬傓偐
ORG 0x7c00 ; 偙偺僾儘僌儔儉偑偳偙偵撉傒崬傑傟傞偺偐
; 埲壓偼昗弨揑側FAT12僼僅乕儅僢僩僼儘僢僺乕僨傿僗僋偺偨傔偺婰弎
JMP entry
DB 0x90
DB "HARIBOTE" ; 僽乕僩僙僋僞偺柤慜傪帺桼偵彂偄偰傛偄乮8僶僀僩乯
DW 512 ; 1僙僋僞偺戝偒偝乮512偵偟側偗傟偽偄偗側偄乯
DB 1 ; 僋儔僗僞偺戝偒偝乮1僙僋僞偵偟側偗傟偽偄偗側偄乯
DW 1 ; FAT偑偳偙偐傜巒傑傞偐乮晛捠偼1僙僋僞栚偐傜偵偡傞乯
DB 2 ; FAT偺屄悢乮2偵偟側偗傟偽偄偗側偄乯
DW 224 ; 儖乕僩僨傿儗僋僩儕椞堟偺戝偒偝乮晛捠偼224僄儞僩儕偵偡傞乯
DW 2880 ; 偙偺僪儔僀僽偺戝偒偝乮2880僙僋僞偵偟側偗傟偽偄偗側偄乯
DB 0xf0 ; 儊僨傿傾偺僞僀僾乮0xf0偵偟側偗傟偽偄偗側偄乯
DW 9 ; FAT椞堟偺挿偝乮9僙僋僞偵偟側偗傟偽偄偗側偄乯
DW 18 ; 1僩儔僢僋偵偄偔偮偺僙僋僞偑偁傞偐乮18偵偟側偗傟偽偄偗側偄乯
DW 2 ; 僿僢僪偺悢乮2偵偟側偗傟偽偄偗側偄乯
DD 0 ; 僷乕僥傿僔儑儞傪巊偭偰側偄偺偱偙偙偼昁偢0
DD 2880 ; 偙偺僪儔僀僽戝偒偝傪傕偆堦搙彂偔
DB 0,0,0x29 ; 傛偔傢偐傜側偄偗偳偙偺抣偵偟偰偍偔偲偄偄傜偟偄
DD 0xffffffff ; 偨傇傫儃儕儏乕儉僔儕傾儖斣崋
DB "HARIBOTEOS " ; 僨傿僗僋偺柤慜乮11僶僀僩乯
DB "FAT12 " ; 僼僅乕儅僢僩偺柤慜乮8僶僀僩乯
RESB 18 ; 偲傝偁偊偢18僶僀僩偁偗偰偍偔
[INSTRSET "i486p"]
; 僾儘僌儔儉杮懱
entry:
MOV AX,0 ; 儗僕僗僞弶婜壔
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
; 僨傿僗僋傪撉傓
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
readloop:
MOV SI,0 ; 记录失败次数
retry:
MOV AH,0x02 ; AH=0x02 : 读入磁盘
MOV AL,1 ; 1个扇区
MOV BX,0
MOV DL,0x00 ; A驱动器
INT 0x13 ; 调用磁盘BIOS
JNC next ; 没有出错时跳转到next
ADD SI,1 ; SI+1
CMP SI,5 ; SI与5比较
JAE error ; SI >= 5 跳转到error
MOV AH,0x00
MOV DL,0x00 ; A驱动器
INT 0x13 ; 重置驱动器
JMP retry
next:
MOV AX,ES ; 段内存地址 + 0x200
ADD AX,0x0020
MOV ES,AX ; ADD ES,0x020
ADD CL,1 ; CL + 1
CMP CL,18 ; CL 与18比较
JBE readloop ; CL <= 18 跳转到readloop
MOV CL,1
ADD DH,1
CMP DH,2
JB readloop ; DH < 2 跳转到readloop傊
MOV DH,0
ADD CH,1
CMP CH,CYLS
JB readloop ; CH < CYLS 跳转到readloop
; 撉傒廔傢偭偨偺偱haribote.sys傪幚峴偩両
MOV [0x0ff0],CH ; IPL偑偳偙傑偱撉傫偩偺偐傪儊儌
;JMP 0xc200;
;MOV AX, 0x0;
;MOV DS, AX;
;MOV AX, 0xB800;
;MOV ES, AX;
;MOV CH, 10
;MOV DX, (80*13) * 2;
;ADDRAGAIN:
;MOV AX, 0xC319
;SUB AL, CH
;MOV DI, AX;
;MOV BL, [DS:DI];
;MOV CL, 2
;AGAIN:
;ROL BL, 4
;MOV AL, BL
;AND AL, 0FH
;OR AL, 30H
;CMP AL, 3AH
;JB NEXTSTEP
;ADD AL, 07H
;NEXTSTEP:
;MOV SI, DX;
;MOV AH, 0x0C;
;MOV [ES:SI], AX;
;ADD DX, 2;
;DEC CL;
;JNZ AGAIN
;ADD DX, 2;
;DEC CH;
;JNZ ADDRAGAIN
;EXIT:
;MOV ax, cs
;MOV es, ax
;MOV ss, ax
;MOV sp, 0100h
MOV ax, 0
MOV ds, ax
MOV EAX, 0x1BADB002
CMP EAX, [DS:0xc204]
;CMP EAX, [DS:0xc208];
JE LOADSUCESS
MOV SI, msg2
JMP putloop
LOADSUCESS:
; 为加载 GDTR 作准备
;xor eax, eax
;mov ax, cs
;shl eax, 4
;add eax, LABEL_GDT ; eax <-
;mov dword [GdtPtr + 2], eax ;
; 加载 GDTR
lgdt [GdtPtr]
; 关中断
cli
; 打开地址线A20
in al, 92h
or al, 00000010b
out 92h, al
; 准备切换到保护模式
mov eax, cr0
or eax, 1
mov cr0, eax
; 真正进入保护模式
jmp 0x8:LABEL_SEG_CODE32;
;jmp 0x8:0
error:
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; SI偵1傪懌偡
CMP AL,0
JE fin
MOV AH,0x0e ; 堦暥帤昞帵僼傽儞僋僔儑儞
MOV BX,15 ; 僇儔乕僐乕僪
INT 0x10 ; 價僨僆BIOS屇傃弌偟
JMP putloop
fin:
HLT ; 壗偐偁傞傑偱CPU傪掆巭偝偣傞
JMP fin ; 柍尷儖乕僾
msg:
DB 0x0a, 0x0a ; 夵峴傪2偮
DB "load error"
DB 0x0a ; 夵峴
DB 0
msg2:
DB 0x0a ; 夵峴傪2偮
DB "grubMagic error"
DB 0x0a ; 夵峴
DB 0
ALIGNB 16
LABEL_GDT:
DW 0x0
DW 0x0
DB 0x0
DW 0x0
DB 0x0
LABEL_DESC_CODE32:
DW 0xFFFF
DW 0x0000
DB 0x0
DW 0xcf9e
DB 0x0
;dq 0x00cf9e000000ffff
LABEL_DESC_VIDEO:
DW 0xffff
DW 0x0000
DB 0x00
DW 0x0f92
DB 0x0
;0x00cf92 000000ffff
GdtPtr:
DW 0x17
DD LABEL_GDT
[BITS 32]
LABEL_SEG_CODE32:
MOV AX, 0x10
MOV DS, AX
MOV ES, AX
MOV FS, AX
MOV GS, AX
MOV SS, AX
MOV ESP, 0xa100
;MOV EAX, 0xB8000
;ADD EAX, (80 * 15 + 10) * 2
;MOV edi, EAX; 屏幕
;MOV ah, 0Ch ; 0000: 黑底 11
;MOV al, 0x42
;MOV [gs:edi], ax
; 初始化 32 位代码段描述符
;MOV EAX, dword [DS:0xc218] ;0x200000
MOV EAX, dword [DS:0xc214]
MOV EBX, 0xc200
MOV ECX, 0x2D000; 0xffff
memcpy:
MOV ESI, EBX
MOV EDI, EAX
MOV DL, byte[DS:ESI]
MOV byte[DS:EDI], DL
INC EAX
INC EBX
DEC ECX
JNZ memcpy
;xor eax, eax
;MOV ax, cs
;shl eax, 4
;add eax, LABEL_SEG_CODE32
;MOV EAX, dword [DS:0xc218]
MOV EAX, dword [DS:0xc214]
mov word [LABEL_DESC_CODE32 + 2], AX
shr eax, 16
mov byte [LABEL_DESC_CODE32 + 4], AL
mov byte [LABEL_DESC_CODE32 + 7], AH
MOV ECX, (80*25 - 1) * 2
CLEANLOOP:
MOV EAX, 0xB8000;
ADD EAX, ECX;
MOV ESI, EAX;
MOV AX, 0xF00;
MOV WORD [GS:ESI], AX;
SUB ECX, 0x2
JNZ CLEANLOOP
MOV ESI, 0xB8000;
MOV AX, 0xF00;
MOV WORD [GS:ESI], AX;
;MOV CH, 0x10
;MOV EDX, 0xB8000
;ADD EDX, (80*13) * 2;
;ADDRAGAIN:
;MOV EAX, 0x4000010
;SUB AL, CH
;MOV EDI, EAX
;MOV BL, [DS:EDI]
;MOV CL, 2
;AGAIN:
;ROL BL, 4
;MOV AL, BL
;AND AL, 0FH
;OR AL, 30H
;CMP AL, 3AH
;JB NEXTSTEP
;ADD AL, 07H
;NEXTSTEP:
;MOV ESI, EDX
;MOV AH, 0x0C
;MOV [GS:ESI], AX
;ADD EDX, 2
;DEC CL
;JNZ AGAIN
;ADD EDX, 2
;DEC CH
;JNZ ADDRAGAIN
MOV ESP, 0xc100
PUSHFD
POP EAX
MOV EBX, EAX
XOR EAX, 0x200000
PUSH EAX
POPF
PUSHFD
POP EAX
;MOV EBX, dword [DS:0xc218] ;0x200000
;MOV EBX, dword [DS:0xc268] ;0x200000
;MOV EBX, [LABEL_DESC_CODE32 + 2]
MOV EBX, ESP
MOV EAX, 0xB8000;
ADD EAX,(80*24 + 4) * 2;
MOV EDX, EAX
XOR EAX, EAX
MOV CL, 8
AGAIN1:
ROL EBX, 4
MOV AL, BL
AND AL, 0FH
OR AL, 30H
CMP AL, 3AH
JB NEXTSTEP2
ADD AL, 07H
NEXTSTEP2:
MOV ESI, EDX;
MOV AH, 0x0C;
MOV [GS:ESI], AX;
ADD EDX, 2;
DEC CL;
JNZ AGAIN1
JMP 0x8:0x0
;jmp 0x8:0xc200;
DEAD:
HLT
JMP DEAD
RESB 0x7dfe-$ ; 0x7dfe傑偱傪0x00偱杽傔傞柦椷
DB 0x55, 0xaa
一个进入保护模式加载引导程序的BOOTLOADER相关推荐
- [css] 请用css写一个扫码的加载动画图
[css] 请用css写一个扫码的加载动画图 @Keyframes donut-spin { 0% { transform: rotate(0deg); } 100% { transform: rot ...
- 一个到顶部自动加载更多的ListView
为什么80%的码农都做不了架构师?>>> 一个可以到顶自动加载更多的ListView,实现该控件的目的是用于im聊天页面场景,一些第三方实现的下拉加载更多也可以实现类似功能,但 ...
- libGDX跨平台游戏开发框架入门:开发一个小游戏之加载资源
目录 前言 加载资源 libGDX资源目录说明 配置各个平台启动器 desktop模块启动器设置 Android模块启动器设置 加速度计和指南针 html模块启动器设置 编写加载资产代码 1. 加载图 ...
- arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图
arcgis前端(2)----->基础篇–发布一个自定义地图及加载自定义地图/底图 文章目录 arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图 前言 & ...
- 从一个ELF程序的加载窥探操作系统内核-(5)
从一个ELF程序的加载窥探操作系统内核-(5) 操作系统加载一个ELF程序看似一个EASY的动作,其实下面隐藏了很多很多OS内核的关键实现,让我们一起来解密其中的流程 作者是一个micro kerne ...
- 【网络通信与信息安全】之深入解析从输入一个URL到页面加载完成的过程
一.前言 从输入一个 URL,然后按下回车到显示页面,中间发生了什么?这是一道经典的面试题,不光前端面试会问到,后端面试也会被问到.这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解 ...
- 实现一个清新美观的加载按钮
今日科技快讯 近日,文化部部署北京.上海.广东.浙江等地文化市场综合执法机构,对50家主要网络表演经营单位进行集中执法检查,虎牙直播.YY直播.龙珠直播.火猫直播.秒拍等30家内容违规的网络表演平台被 ...
- 愉快的舞会c++_如何在5分钟内建立一个令人愉快的加载屏幕
愉快的舞会c++ First, here is what we will build. Set your timer! 首先,这是我们将要建立的. 设置您的计时器! Does this look fa ...
- Android中用URL模拟一个简单的图片加载器
首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...
最新文章
- java安全插件_如何安全地实现Java插件安全性?
- locate和find命令
- 教育培训行业如何在抖音快速获客、变现?
- Pylearn2之YAML
- 为什么要学Access?
- 初识ABP vNext(4):vue用户登录菜单权限
- background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
- 深入浅出mysql gtid_Mysql 5.7 Gtid内部学习(九) 实际案例(一)
- [2018.07.10 T1]叠盒子
- 离散数学及其应用 第一章习题
- WebRTC 教程二:WebRTC API 和 Leak
- 国内首款安全三级密码卡诞生!
- 色色教你玩魔方(傻瓜式全程图解教学)
- mysql int 11 最大多少_MySQL中int(11)最大长度是多少?
- 斐波那契数列求和(递归)
- NotePad++ 中文乱码,软件里设置后还是乱码
- MATLAB中求矩阵特征值和特征向量
- 题目1072 括号匹配问题
- 确实, 5G与物联网离不开区块链!
- [算法入门笔记] 9. 哈希表与哈希函数
热门文章
- 联想Y50C加内存条
- 应用 AddressSanitizer 发现程序内存错误
- Java之每日经典一题:(1)珠穆朗玛峰
- SELECT...INTO语法
- 在微信中点击棋牌游戏类app下载链接显示已停止访问打不开的解决办法
- JS逆向、破解、反混淆、反浏览器指纹——JS补环境框架
- JavaScript中Date的setMonth()顺延问题及解决方法
- java-net-php-python-jspm广联超市管理系统计算机毕业设计程序
- 高效地分析Android内存--MAT工具解析
- 基于51单片机的霓虹灯c语言,基于单片机控制的霓虹灯控制器056