这次我们要用到4个文件,分别是ipl.nas、asmhead.nas、func.nas和 bootpack.c。
ipl.nas是引导扇区中的16bit程序,用于从磁盘中加载数据并跳转到asmhead.nas中。
asmhead.nas也是16bit程序,用于加载全局变量表,切换cpu到32位的保护模式,并跳转到后面的程序。
bootpack.c用于改变屏幕颜色,func.nas为bootpack.c提供相应的一些函数。
那么我们现在就开始吧。
ipl.nas和上一篇文章中的程序几乎没有什么变化,我去掉了打印hello world的部分,同时在其中多加了一句MOV [0x0ff0],CH来记录读了多少个柱面。
程序一、ipl.nas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hello-os
; TAB=8
ORG 0x7C00
; 标准FAT格式软盘
start:
JMP entry
DB "HELLOIPL" ; 启动区名称(8字节)
DW 512 ; 扇区大小(512字节)
DB 1 ; 簇大小(1扇区)
DW 1 ; FAT起始位置 Reserved Sectors
DB 2 ; FAT个数
DW 224 ; 根目录(224项) Root Entries
DW 2880 ; 磁盘大小(2880扇区) 2*80*18 Small Sectors
DB 0xf0 ; 磁盘种类
DW 9 ; FAT长度
DW 18 ; 每个磁道扇区数
DW 2 ; 磁头数
DD 0 ; 隐藏扇区
DD 2880 ; 重写一次磁盘大小 Large Sectors
DB 0,0,0x29 ; Physical Drive Number, Current Head, Signature
DD 0xffffffff ; 可能是卷标号码 ID
DB "HELLO-OS " ; 磁盘名称(11字节) Volume Label
DB "FAT12 " ; 格式名称(8字节) System ID
RESB 18 ; 空出18字节
; 进入引导程序
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
; 读磁盘
CYLS EQU 10
MOV AX,0x0820
MOV ES,AX ; ES:BX为内存缓存地址 ESx16+BX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
readloop:
MOV SI,0 ; 记录失败次数
retry:
MOV AH,0x02 ; 读盘
MOV AL,1 ; 1个扇区
MOV BX,0
MOV DL,0x00 ; 0驱动器
INT 0x13 ; 调用磁盘BIOS
JNC next ; 没出错则读下一个扇区
ADD SI,1
CMP SI,5 ; 比较SI与5
JAE error ; 超过允许错误次数,跳转到error
MOV AH,0x00
MOV DL,0x00
INT 0x13 ; 重置驱动器
JMP retry
next:
MOV AX,ES
ADD AX,0x0020 ; 把内存地址后移0x200
MOV ES,AX ; 因为没有(ADD ES,0x20)
ADD CL,1
CMP CL,18

本文介绍了如何从汇编语言编写引导扇区,再到使用C语言编写操作系统的核心部分。通过ipl.nas、asmhead.nas、func.nas和bootpack.c四个文件,逐步构建操作系统。ipl.nas负责加载数据,asmhead.nas切换到保护模式,bootpack.c改变屏幕颜色,func.nas提供辅助函数。文章详细阐述了每个阶段的代码实现和转换过程,最终通过编译和链接生成可运行的二进制文件。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



