day01_启动程序装载器 IPL

; haribote-ipl
; TAB=4

		ORG		0x7c00			

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 启动区的名称 可以使任意字符
		DW		512				; 设置每个扇区的大小
		DB		1				; 簇的大小 也就是OS 每次对磁盘读写的 最小单元
		DW		1				; FAT的 起始位置 第一个扇区  001 扇区
								;BIOS 读取该扇区的内容 并将其放置在0x7C00位置
		DB		2				; FAT的个数
		DW		224				; 根目录的大小 一般设置为224
		DW		2880			; 该磁盘的大小 为2880扇区 2*80*18
								;两个磁头 每个磁头80个磁道 每个磁道 18个扇区
		DB		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 "	; 磁盘名称
		DB		"FAT12   "		; 磁盘格式名称
		RESB	18				; 空出 18个 字节

; 程序主体

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

		MOV		AH,0x02			; AH=0x02 : 读盘  BIOS 的 0x13中断
		MOV		AL,1			; 读取 一个扇区
		MOV		BX,0
		MOV		DL,0x00			; A驱动器
		INT		0x13			; 调用磁盘的BIOS
		JC		error			;如果调用BIOS 出现错误 则CF为1 有错误 错误码写入AH内

; 一些处理函数

fin:
		HLT						; 让CPU停止 等待指令
		JMP		fin				; 无限循环

error:
		MOV		SI,msg
putloop:
		MOV		AL,[SI]			;间接寻址
		ADD		SI,1			; SI 偏移到 下个地址
		CMP		AL,0			;因为 [SI]的结束 是0
		JE		fin
		MOV		AH,0x0e			; 显示一个文字
		MOV		BX,15			; 指定字符颜色
		INT		0x10			; 调用显卡的BIOS
		JMP		putloop			;循环
msg:
		DB		0x0a, 0x0a		; 输出两个换行
		DB		"load error"
		DB		0x0a			; 换行
		DB		0

		RESB	0x7dfe-$		; 填写0x00 直到7dfe

		DB		0x55, 0xaa      ;启动区 最后两个字节 必须是这种格式0x55AA

ES 寄存器的内容为 0x0820 BX = 0
所以 这个扇区会被装载到 ES*16+BX 即 0x8200
所以 0x8200-0x83ff 都是这个扇区的内容

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值