一、内存分布图

二、启动区汇编代码

这段代码是启动区代码,启动区的代码会保存到0x7c00至0x7dff(ORG 0x7c00),0x7c00之前的区域存放着BIOS程序或让BIOS程序用来实现各种功能,0x7e00到0x7fff为止的区域保留,并将启动区代码拷贝到0x8000到0x81ff(没从代码上看到,怎么做到的?)。

以下这段启动区代码将从0柱面、0磁头、2扇区开始的10个柱面、2个磁头、18个扇区的内容读入到内存的0x8200之后的位置(MOV AX,0x0820)

     1 00000000                                 ; haribote-ipl2 00000000                                 ; TAB=43 00000000                                 4  = 0000000A                              CYLS EQU     10              ; 声明常量5 00000000                                 6                                                  ORG     0x7c00          ; 指明程序的装载地址7 00007C00                                 8 00007C00                                 ; 以下这段是标准FAT12格式软盘专用的代码9 00007C00                                 10 00007C00 EB 4E                                JMP     entry           ; 跳转到entry11 00007C02 90                                    DB      0x9012 00007C03 48 41 52 49 42 4F 54 45                 DB      "HARIBOTE"        ; 启动区的名称可以是任意的字符串(8字节)13 00007C0B 0200                                    DW      512             ; 每个扇区的大小14 00007C0D 01                                     DB      1               ; 簇的大小15 00007C0E 0001                                  DW      1               ; FAT的起始位置16 00007C10 02                                    DB      2               ; FAT的个数17 00007C11 00E0                                    DW      224             ; 根目录的大小18 00007C13 0B40                                    DW      2880            ; 该磁盘的大小19 00007C15 F0                                      DB      0xf0            ; 磁盘的种类20 00007C16 0009                                 DW      9               ; FAT的长度21 00007C18 0012                                    DW      18              ; 一个磁道有几个扇区22 00007C1A 0002                                 DW      2               ; 磁头数23 00007C1C 00000000                               DD      0               ; 不使用分区24 00007C20 00000B40                             DD      2880            ; 重写一次磁盘大小25 00007C24 00 00 29                              DB      0,0,0x29        ; 意义不明26 00007C27 FFFFFFFF                              DD      0xffffffff      ; 可能是卷标号码27 00007C2B 48 41 52 49 42 4F 54 45 4F 53          DB      "HARIBOTEOS " ; 磁盘的名称(11字节)00007C35 20 28 00007C36 46 41 54 31 32 20 20 20              DB      "FAT12   "        ; 磁盘格式名称(8字节)29 00007C3E 00 00 00 00 00 00 00 00 00 00        RESB    18              ; 先空出18字节00007C48 00 00 00 00 00 00 00 00 30 00007C50                                 31 00007C50                                 ; 程序主体32 00007C50                                 33 00007C50                                 entry:34 00007C50 B8 0000                               MOV     AX,0            ; 寄存器初始化35 00007C53 8E D0                                   MOV     SS,AX36 00007C55 BC 7C00                                MOV     SP,0x7c0037 00007C58 8E D8                                  MOV     DS,AX38 00007C5A                                 39 00007C5A                                 ; 读磁盘40 00007C5A                                 41 00007C5A B8 0820                               MOV     AX,0x0820       ; AX=0x082042 00007C5D 8E C0                                   MOV     ES,AX           ; ES=AX43 00007C5F B5 00                                   MOV     CH,0            ; 柱面044 00007C61 B6 00                                  MOV     DH,0            ; 磁头045 00007C63 B1 02                                  MOV     CL,2            ; 扇区246 00007C65                                 readloop:47 00007C65 BE 0000                               MOV     SI,0            ; 记录失败次数的寄存器48 00007C68                                 retry:49 00007C68 B4 02                                 MOV     AH,0x02         ; AH=0x02 : 读入磁盘50 00007C6A B0 01                                  MOV     AL,1            ; 1个扇区51 00007C6C BB 0000                               MOV     BX,0            ; BX=052 00007C6F B2 00                                MOV     DL,0x00         ; A驱动器53 00007C71 CD 13                                 INT     0x13            ; 调用磁盘BIOS54 00007C73 73 10                                 JNC     next            ; 没出错时跳转到next55 00007C75 83 C6 01                               ADD     SI,1            ; SI加156 00007C78 83 FE 05                              CMP     SI,5            ; 比较SI与557 00007C7B 73 2E                                   JAE     error           ; SI >= 5时,跳转到error58 00007C7D B4 00                                 MOV     AH,0x00         ; 复位磁盘驱动器59 00007C7F B2 00                                  MOV     DL,0x00         ; A驱动器60 00007C81 CD 13                                 INT     0x13            ; 重置驱动器61 00007C83 EB E3                                JMP     retry62 00007C85                                 next:63 00007C85 8C C0                                 MOV     AX,ES64 00007C87 05 0020                                ADD     AX,0x002065 00007C8A 8E C0                                  MOV     ES,AX           ; ADD ES,0x02066 00007C8C 80 C1 01                              ADD     CL,1            ; CL加167 00007C8F 80 F9 12                              CMP     CL,18           ; 比较CL和1868 00007C92 76 D1                                  JBE     readloop        ; 如果CL <= 18,则跳转至readloop69 00007C94 B1 01                                   MOV     CL,1            ; CL赋值为170 00007C96 80 C6 01                                ADD     DH,1            ; DH加171 00007C99 80 FE 02                              CMP     DH,2            ; 比较DH和272 00007C9C 72 C7                                   JB      readloop        ; 如果DH < 2,则跳转到readloop73 00007C9E B6 00                                  MOV     DH,0            ; DH赋值为074 00007CA0 80 C5 01                                ADD     CH,1            ; CH加175 00007CA3 80 FD 0A                              CMP     CH,CYLS         ; 比较CH和CYLS76 00007CA6 72 BD                                JB      readloop        ; 如果CH < CYLS,则跳转到readloop77 00007CA8                                 78 00007CA8                                 ; 已经读完,让CPU进入待机状态79 00007CA8                                 80 00007CA8                                 fin:81 00007CA8 F4                                      HLT                     ; 让CPU停止,等待指令82 00007CA9 EB FD                                   JMP     fin             ; 无限循环83 00007CAB                                 84 00007CAB                                 error:85 00007CAB BE 7CC0                                 MOV     SI,msg          ; 将msg标签地址0x7CCD赋值给SI86 00007CAE                                 putloop:87 00007CAE 8A 04                                  MOV     AL,[SI]         ; 将内存地址[SI]赋值给AL88 00007CB0 83 C6 01                                ADD     SI,1            ; SI加189 00007CB3 3C 00                                 CMP     AL,0            ; 比较AL和090 00007CB5 74 F1                                   JE      fin             ; 如果AL = 0,已经输出完毕,则跳转到fin91 00007CB7 B4 0E                                   MOV     AH,0x0e         ; 显示一个文字92 00007CB9 BB 000F                                 MOV     BX,15           ; 指定字符颜色93 00007CBC CD 10                                   INT     0x10            ; 调用显卡BIOS94 00007CBE EB EE                                 JMP     putloop         ; 跳转到putloop95 00007CC0                                 msg:96 00007CC0 0A 0A                                   DB      0x0a, 0x0a      ; 换行2次97 00007CC2 6C 6F 61 64 20 65 72 72 6F 72         DB      "load error"  ; 加载错误98 00007CCC 0A                                    DB      0x0a            ; 换行99 00007CCD 00                                      DB      0100 00007CCE                                 101 00007CCE 00 00 00 00 00 00 00 00 00 00        RESB    0x7dfe-$        ; 以0x00填充到0x7dfe为止00007CD8 00 00 00 00 00 00 00 00 00 00 00007CE2 00 00 00 00 00 00 00 00 00 00 00007CEC 00 00 00 00 00 00 00 00 00 00 00007CF6 00 00 00 00 00 00 00 00 00 00 00007D00 00 00 00 00 00 00 00 00 00 00 00007D0A 00 00 00 00 00 00 00 00 00 00 00007D14 00 00 00 00 00 00 00 00 00 00 00007D1E 00 00 00 00 00 00 00 00 00 00 00007D28 00 00 00 00 00 00 00 00 00 00 00007D32 00 00 00 00 00 00 00 00 00 00 00007D3C 00 00 00 00 00 00 00 00 00 00 00007D46 00 00 00 00 00 00 00 00 00 00 00007D50 00 00 00 00 00 00 00 00 00 00 00007D5A 00 00 00 00 00 00 00 00 00 00 00007D64 00 00 00 00 00 00 00 00 00 00 00007D6E 00 00 00 00 00 00 00 00 00 00 00007D78 00 00 00 00 00 00 00 00 00 00 00007D82 00 00 00 00 00 00 00 00 00 00 00007D8C 00 00 00 00 00 00 00 00 00 00 00007D96 00 00 00 00 00 00 00 00 00 00 00007DA0 00 00 00 00 00 00 00 00 00 00 00007DAA 00 00 00 00 00 00 00 00 00 00 00007DB4 00 00 00 00 00 00 00 00 00 00 00007DBE 00 00 00 00 00 00 00 00 00 00 00007DC8 00 00 00 00 00 00 00 00 00 00 00007DD2 00 00 00 00 00 00 00 00 00 00 00007DDC 00 00 00 00 00 00 00 00 00 00 00007DE6 00 00 00 00 00 00 00 00 00 00 00007DF0 00 00 00 00 00 00 00 00 00 00 00007DFA 00 00 00 00 102 00007DFE                                 103 00007DFE 55 AA                                   DB      0x55, 0xaa      ; 启动区标志

三、汇编语言指令

JC(jump if carry)如果进位标志(carry flag)是1的话就跳转,进位标志用来表示有没有进位,但在CPU的标志中,它是最简单易用的,所以在其他地方也经常用到,可以用来报告BIOS函数调用是否有错
JNC(jump if not carry)如果进位标志是0的话就跳转
JAE(jump if above or equal)大于或等于时跳转
JBE(jump if below or equal)小于或等于时跳转
JB(jumo if below)小于时跳转

四、BIOS中断

电脑里有个名为BIOS(basic input output system)的程序,出厂时就组装在电脑主板上的ROM(read only memory)单元里,电脑厂家在BIOS中预先写入了操作系统开发人员会用到的一些程序。INT指令调用BIOS中断,INT后面不同的数字可以调用不同的中断,进行中断时会从一些寄存器中读取信息以处理中断,具体的信息可以查询BIOS_interrupt_call

五、显卡模式

VRAM(video RAM)显卡内存,用来显示画面的内存,不同的画面模式的像素数不一样,使用的VRAM也不一样,在VGA图形模式,320×200×8位彩色模式(调色板模式)下,VRAM是0xa0000~0xaffff的64KB

六、导入C语言之后的文件结构

bootpack.c
  |cc1.exe将C语言程序编译成汇编语言源程序
bootpack.gas
  |gas2nask.exe把gas变换成nask能翻译的语法
bootpack.nas                     naskfunc.nas
  |nask.exe翻译成机器语言                |nask.exe翻译成机器语言
bootpack.obj                      naskfunc.obj
  |obi2bim.exe为了做成完整的机器语言文件,必须将必要的目标文件全部链接上
bootpack.bim
  |bim2hrb.exe为了能实际使用,针对每一种操作系统的要求进行必要的加工
bootpack.hrb
  |使用copy指令将asmhead.bin(导入C语言之前的汇编语言文件)和bootpack.hrb简单的结合起来
haribote.sys

30天自制操作系统Day3相关推荐

  1. 30天自制操作系统 Day3

    BIOS的寄存器和磁盘 http://community.osdev.info/?(AT)BIOS 作者给的这个页面可能需要科学上网,访问不了.我的选择是暂时放弃T_T.反正作者写了我们在还页面上会看 ...

  2. [读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言

    1. 制作真正的IPL IPL 启动程序装载器, 用来装载程序 分析代码 ; haribote-ipl ; TAB=4ORG 0x7c00 ; このプログラムがどこに読み込まれるのか; 以下は標準的な ...

  3. 《30天自制操作系统》-day3(MAC)

    第3天 进入32位模式并导入C语言 基本配置 汇编语言内容 文件 hanbote.nas ipl.nas Makefile 原因 用法 基本配置 设备:Macbookpro(13-inch,2018) ...

  4. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  5. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

  6. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...

  7. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  8. 《30天自制操作系统》笔记(04)——显示器256色

    <30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...

  9. 《30天自制操作系统》学习笔记--第好多天

    之前看<30天自制操作系统>,参考而成,和书中系统并不完全一致,是在原有基础上按照自己的习惯而成,由于水平和工作原因,未完成内存管理和文件系统,有兴趣者可以通过以下网址https://gi ...

最新文章

  1. Cell重磅发布15万人体微生物基因组!超大规模宏基因组研究揭示数千计人体微生物新物种...
  2. 干货丨一文看懂什么是知识图谱!
  3. php如何查询数据库表中数据库,PHP+MYSQL如何进行查询数据库
  4. 网络爬虫初步:从一个入口链接开始不断抓取页面中的网址并入库
  5. tensorflow随笔-二分法求解一元方程
  6. linux内存一直在涨,linux内存一直占满问题
  7. P2303 [SDOI2012] Longge(数论/欧拉函数)
  8. mvc4 html.beginform,MVC4 Html.BeginForm在Internet Explorer中提交按钮 9不工
  9. 白盒测试中的六种覆盖方法及案例分析
  10. mysql 语法树_Inception 语法树打印(15)
  11. testVC.modalPresentationStyle = UIModalPresentationFormSheet; 更改 VC大小
  12. PDF文档解析,公司公告信息抽取(附数据集)
  13. mysql清空数据库_mysql命令行快速清空数据库的方法
  14. 窗口电压比较器电路设计
  15. Linux学习笔记(五) -- Linux+Anjuta搭建C++开发环境
  16. oracle 体系架构图
  17. STM32F401的外部中断EXTI
  18. Unity开发-CYJ技术文档总结篇
  19. 几何布朗运动模拟 MATLAB实现
  20. Linux内核 之 GDT LDT与分段

热门文章

  1. 大数据Python基础——第一章 搭建环境
  2. C语言栈顺序存储的数据结构
  3. Kubernetes Pod冗余策略
  4. 访问网络上共享的打印机每次都需要重新输入用户名密码解决方案
  5. Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown works.
  6. 字节流和字符流的转换
  7. Academic Torrents - 学术种子资源下载网
  8. 计算机网络实验-交换机VLAN实验
  9. wallproxy on ubuntu usage
  10. 计算机基础在线阅读高职,高职计算机基础教案一