; 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相关推荐

  1. [css] 请用css写一个扫码的加载动画图

    [css] 请用css写一个扫码的加载动画图 @Keyframes donut-spin { 0% { transform: rotate(0deg); } 100% { transform: rot ...

  2. 一个到顶部自动加载更多的ListView

    为什么80%的码农都做不了架构师?>>>    一个可以到顶自动加载更多的ListView,实现该控件的目的是用于im聊天页面场景,一些第三方实现的下拉加载更多也可以实现类似功能,但 ...

  3. libGDX跨平台游戏开发框架入门:开发一个小游戏之加载资源

    目录 前言 加载资源 libGDX资源目录说明 配置各个平台启动器 desktop模块启动器设置 Android模块启动器设置 加速度计和指南针 html模块启动器设置 编写加载资产代码 1. 加载图 ...

  4. arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图

    arcgis前端(2)----->基础篇–发布一个自定义地图及加载自定义地图/底图 文章目录 arcgis前端(2)----->基础篇--发布一个自定义地图及加载自定义地图/底图 前言 & ...

  5. 从一个ELF程序的加载窥探操作系统内核-(5)

    从一个ELF程序的加载窥探操作系统内核-(5) 操作系统加载一个ELF程序看似一个EASY的动作,其实下面隐藏了很多很多OS内核的关键实现,让我们一起来解密其中的流程 作者是一个micro kerne ...

  6. 【网络通信与信息安全】之深入解析从输入一个URL到页面加载完成的过程

    一.前言 从输入一个 URL,然后按下回车到显示页面,中间发生了什么?这是一道经典的面试题,不光前端面试会问到,后端面试也会被问到.这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解 ...

  7. 实现一个清新美观的加载按钮

    今日科技快讯 近日,文化部部署北京.上海.广东.浙江等地文化市场综合执法机构,对50家主要网络表演经营单位进行集中执法检查,虎牙直播.YY直播.龙珠直播.火猫直播.秒拍等30家内容违规的网络表演平台被 ...

  8. 愉快的舞会c++_如何在5分钟内建立一个令人愉快的加载屏幕

    愉快的舞会c++ First, here is what we will build. Set your timer! 首先,这是我们将要建立的. 设置您的计时器! Does this look fa ...

  9. Android中用URL模拟一个简单的图片加载器

    首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...

最新文章

  1. java安全插件_如何安全地实现Java插件安全性?
  2. locate和find命令
  3. 教育培训行业如何在抖音快速获客、变现?
  4. Pylearn2之YAML
  5. 为什么要学Access?
  6. 初识ABP vNext(4):vue用户登录菜单权限
  7. background 旋转_基于HTML5 Canvas实现工控2D叶轮旋转
  8. 深入浅出mysql gtid_Mysql 5.7 Gtid内部学习(九) 实际案例(一)
  9. [2018.07.10 T1]叠盒子
  10. 离散数学及其应用 第一章习题
  11. WebRTC 教程二:WebRTC API 和 Leak
  12. 国内首款安全三级密码卡诞生!
  13. 色色教你玩魔方(傻瓜式全程图解教学)
  14. mysql int 11 最大多少_MySQL中int(11)最大长度是多少?
  15. 斐波那契数列求和(递归)
  16. NotePad++ 中文乱码,软件里设置后还是乱码
  17. MATLAB中求矩阵特征值和特征向量
  18. 题目1072 括号匹配问题
  19. 确实, 5G与物联网离不开区块链!
  20. [算法入门笔记] 9. 哈希表与哈希函数

热门文章

  1. 联想Y50C加内存条
  2. 应用 AddressSanitizer 发现程序内存错误
  3. Java之每日经典一题:(1)珠穆朗玛峰
  4. SELECT...INTO语法
  5. 在微信中点击棋牌游戏类app下载链接显示已停止访问打不开的解决办法
  6. JS逆向、破解、反混淆、反浏览器指纹——JS补环境框架
  7. JavaScript中Date的setMonth()顺延问题及解决方法
  8. java-net-php-python-jspm广联超市管理系统计算机毕业设计程序
  9. 高效地分析Android内存--MAT工具解析
  10. 基于51单片机的霓虹灯c语言,基于单片机控制的霓虹灯控制器056