《三十天自制操作系统》学习记录01

自制OS记录

《三十天自制操作系统》学习记录

说明:

​ 为了满足我自制OS的小小愿望,慕名买来了《三十天自制操作系统》书籍进行学习,虽然我预料到了估计是一路抄代码。但是学一学也无坏处,如果能点亮几个技能点是再好不过。

​ 本书毕竟是十几年前的老书,操作系统仍然停留在32位,所以与现在主流操作系统差别很大,是极为简单的操作系统。纯属学习以及娱乐打发时间

​ 本人大一,处于学习阶段,有误欢迎私信指正

前三天知识汇总

​ 启动区核心汇编代码

CYLS	EQU		10				; 常量

		ORG		0x7c00			; 指明程序装载地址

; 一下为标准FAT12格式软盘专用代码

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 启动区名称(8字节)
		DW		512				; 扇区大小(必须为512字节)
		DB		1				; 簇大小(必须为1个扇区)
		DW		1				; FAT起始位置(一般从第一个扇区开始)
		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字节

; 程序主体

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			; 没出错跳转fin
		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

; 

		MOV		[0x0ff0],CH		; 
		JMP		0xc200			; 跳转至操作系统程序

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

		RESB	0x7dfe-$		; 填写0x00到0x7dfe $符号为当前和行现在字节数

		DB		0x55, 0xaa
寄存器

​ AX:累加寄存器

​ CX:计数寄存器

​ DX:数据寄存器

​ BX:基址寄存器

​ SP:栈指针寄存器

​ BP:基址指针寄存器

​ SI:源变址寄存器

​ DI:目的变址寄存器

以上为均为16位寄存器;

​ AL:累加寄存器低位

​ CL:计数寄存器低位

​ DL:数据寄存器低位

​ BL:基址寄存器低位

​ AH:累加寄存器高位

​ CH,DH,BH…同上

段寄存器:

​ ES:附加段寄存器

​ CS:代码段寄存器

​ SS:栈段寄存器

​ DS:数据段寄存器

​ FS、GS

相关指令:

​ DB:写入一个字节

​ RESB(reserve byte):空出多少字节

​ DW以及DD:写入字节

​ JMP:跳转(类似C语言goto)

​ MOV:赋值语句

​ ADD:加法

​ CMP:比较

​ JE:条件跳转,相等跳转

​ HLT:CPU停止

BIOS:

存在于电脑主板ROM单元,提供操作系统开发一系列工具

其中INT指令则为调用BIOS里面的函数

MakeFile:

批处理,可在控制台输入字符执行其中的语句

发布了7 篇原创文章 · 获赞 11 · 访问量 371

猜你喜欢

转载自blog.csdn.net/Archerrrrr/article/details/105474754
今日推荐