首页 > 其他分享 >30天自制操作系统(一)启动区

30天自制操作系统(一)启动区

时间:2024-10-19 19:49:38浏览次数:7  
标签:操作系统 自制 30 BH MOV SI BYTE BX DS

一、启动区

	ORG		0x7C00
	JMP		entry
	DB		0x90
	DB		"HELLOIPL"
	DW		512
	DB		1
	DW		1
	DB		2
	DW		224
	DW		2880
	DB		0xf0
	DW		9
	DW		18
	DW		2
	DD		0
	DD		2880
	DB		0,0,0x29
	DD		0xffffffff
	DB		"HELLO-OS   "
	DB		"FAT12   "
	RESB	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		AL, 1	;扇区数量
	MOV		BX, 0
	MOV		DL, 0	;A驱动器
	MOV		AH, 0x02	;读扇区
	INT		0x13
	JNC		next
	
error:
	MOV		AH, 0x0e
	MOV		AL, 'e'
	INT		0x10
	MOV		AL, 'r'
	INT		0x10
	MOV		AL, 'r'
	INT		0x10
	MOV		AL, 'o'
	INT		0x10
	MOV		AL, 'r'
	INT		0x10
	JMP		fin
	
next:
	MOV		AX, ES	
	ADD		AX, 0x20	;下一扇区
	MOV		ES, AX
	ADD		CL, 1
	CMP		CL, 18
	JBE		readloop
	
	MOV		CL, 1
	ADD		DH, 1
	CMP		DH, 2
	JB		readloop	;读反面的磁头1
	
	MOV		DH, 0
	ADD		CH, 1
	CMP		CH, 10		;读10个柱面
	JB		readloop
	
	JMP		0xc200

fin:
	HLT
	JMP		fin

	RESB	0x7dfe-$
	DB		0x55, 0xaa

前面的一部分内容(entry之前)是img镜像文件的固定格式,后面是启动区的正式内容

使用循环的方式读磁盘,按扇区——磁头——柱面的顺序,一个磁头18个扇区,一个柱面两个磁头。

程序的最后跳转到0xc200,因为磁盘内容装载在0x8000,文件内容存在0x4200,所以kernal.com就在0x8000+0x4200=0xc200的位置

(二)操作系统本身

;kernal.nas

[BITS 16]
	ORG	0xc200

	MOV	AH, 0x0e
	MOV	AL, 'A'
	INT	0x10

fin:
	HLT
	JMP	fin

输出一个A字符。

使用nasm kernal.nas -o kernal.com的方式编译,装载到img文件中即可。程序的开始要指定ORG 0xc200, 这样汇编器才能正确把标签名对照到正确的地址。

(三)图形模式切换

切换到图形模式:

	MOV	AL, 0x13
	MOV	AH, 0x00
	INT	0x10

分辨率320*200的VGA图形模式,VRAM的地址在0xa0000~0xaffff。
注意十六位下,用SI/DI寻址只能寻址到0x0000~0xffff的地址,所以要用寄存器寻址。

描画条纹图案:

		MOV		AX,0xA000
		MOV		DS,AX


		MOV		AL, 0x13
		MOV		AH, 0x00
		INT		0x10
		MOV		SI, 0x0000
L1:
		MOV		BX, SI
		AND		BL, 0x0f
		MOV		BYTE[DS:SI], BL
		ADD		SI, 1
		CMP		SI, 0xFFFF
		JBE		L1
fin:
		HLT
		JMP		fin

参考书中第四天的内容写的,不过暂时还未切换32位模式所以只能用汇编写。用[DS:SI]的方式寻址,16位下段号相当于[DS*16+SI],DS代入0xA000,SI代入0x0000,那么[DS:SI]就是[0xA0000]。

上一节是在80*25的字符模式下描画了一个文字A,这次我们尝试着在图形模式下描画文字A,参考第五天中文字显示的代码。

用汇编语言写比较复杂的循环可能是比较麻烦...(

实现如下:

其实主体的结构不难,最难的其实是内存段的处理,访问font_A的时候指定的是代码段寄存器CS,而访问显存需要指定数据段DS,还不能混用,如果给CS赋0xA0000就会出大问题。

[BITS 16]
	ORG	0xc200

	MOV	AL, 0x13
	MOV	AH, 0x00
	INT	0x10

	;font_A
	MOV	CX, 0
	MOV	AX, 0xa000
	MOV	DS, AX
	MOV	SI, 0x0000
	ADD	SI, 8*320
	ADD	SI, 8

loop:
	CMP	CX, 16
	JE	fin
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x80
	CMP	BH, 0
	JE	L1
	MOV	BYTE[DS:SI+0], 15
L1:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x40
	CMP	BH, 0
	JE	L2
	MOV	BYTE[DS:SI+1], 15
L2:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x20
	CMP	BH, 0
	JE	L3
	MOV	BYTE[DS:SI+2], 15
L3:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x10
	CMP	BH, 0
	JE	L4
	MOV	BYTE[DS:SI+3], 15
L4:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x08
	CMP	BH, 0
	JE	L5
	MOV	BYTE[DS:SI+4], 15
L5:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x04
	CMP	BH, 0
	JE	L6
	MOV	BYTE[DS:SI+5], 15
L6:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x02
	CMP	BH, 0
	JE	L7
	MOV	BYTE[DS:SI+6], 15
L7:
	MOV	BX, CX
	MOV	BH, BYTE[CS:font_A+BX]
	AND	BH, 0x01
	CMP	BH, 0
	JE	L8
	MOV	BYTE[DS:SI+7], 15
L8:
	ADD	CX, 1
	ADD	SI, 320
	JMP	loop

fin:
	HLT
	JMP	fin

font_A:
	DB	0x00,0x18,0x18,0x18,0x18,0x24,0x24,0x24
	DB	0x24,0x7e,0x42,0x42,0x42,0xe7,0x00,0x00

话说在320*200的分辨率下,8*16的字符看上去确实很大==

标签:操作系统,自制,30,BH,MOV,SI,BYTE,BX,DS
From: https://www.cnblogs.com/jisuanjizhishizatan/p/18484342

相关文章

  • 操作系统(6) (Named /Unnamed Semaphore信号量详解)
    目录1:信号量的基本概念2:命名信号量的示例代码3.无名信号量(UnnamedSemaphore)背景(Background)示例代码讲解初始化无名信号量线程函数创建线程并等待完成销毁信号量总结4.对比1:信号量的基本概念背景介绍:信号量是一种并发编程中的同步原语,它用于协调多......
  • 【rCore OS 开源操作系统】Rust 智能指针
    前置知识点何为“智能”在Rust中,“智能指针”是指那些实现了特定智能行为的指针类型。这些智能行为通常包括内存管理、生命周期跟踪以及所有权转移等。常见智能指针BoxBox<T>是Rust中最简单的智能指针类型之一,它用于堆分配的内存。Box<T>允许你在堆上分配类型T......
  • 20222305 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    网络攻防实验报告姓名:田青学号:20222305实验日期:2024/10/16—2024/10/23实验名称:后门原理与实践指导教师:王志强1.实验内容本周学习内容总结::后门概念:不经过正常认证流程而访问系统的通道。后门类型:编译器后门、操作系统后门、应用程序后门、潜伏于操作系统中或伪装为特......
  • 专题二:操作系统基本原理
    1.操作系统概述操作系统:管理系统的硬件、软件、数据资源控制程序运行人机之间的接口应用软件与硬件之间的接口进程管理存储管理文件管理作业管理设备管理2.进程管理2.1.进程状态(三态模型、五态模型)2.2.★★★信号量与PV操作★★★2.2.1.前趋图2.2.2.进程......
  • 2024.10.18 2309版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 20222306 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    1.实验内容1.1实践目标(1)使用netcat获取主机操作Shell,cron启动某项任务(任务自定)PS:cron是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程(2)使用socat获取主机操作Shell,任务计划启动(3)使用MSFmeterpreter(或其他软件)生成可执行文件,利用ncat或socat传......
  • 牛客练习赛130-A题题解
    牛客练习赛130-A题题解题目描述如下:给定两个整数x,y,jackle希望把x变成y。他每次可以进行如下两种操作之一:选择任意一个整数z,令x=x&z。选择任意一个整数z,令x=x|z。请问最少操作几次可以把x变成y。输入描述:本题有多组测试数据。第一行输入1个正整数T(1≤T......
  • 代码随想录算法训练营day18 |530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数
    学习资料:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html530.二叉搜索树的最小绝对差(双指针法,pre&cur,设置最小差值初始为无穷大,当差值<最小差值就更新最小差值)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(......
  • 【GESP】C++一级练习BCQM3048,顺序执行、逆推运算
    一道根据结果,一步一步逆推之前结果的题,完全顺序语句执行题目题解详见:https://www.coderli.com/gesp-1-bcqm3048/【GESP】C++一级练习BCQM3048,顺序执行、逆推运算|OneCoder一道根据结果,一步一步逆推之前结果的题,完全顺序语句执行。https://www.coderli.com/gesp-1-bcqm3048/......
  • 【GESP】C++一级练习BCQM3049,细胞分裂
    GESP一级知识点整形int和for循环练习。题目题解详见:【GESP】C++一级练习BCQM3049,细胞分裂|OneCoder【GESP】C++一级练习BCQM3049,细胞分裂|OneCoderGESP一级知识点整形int和for循环练习。https://www.coderli.com/gesp-1-bcqm3049/C++GESP专项交流频道:GESP学习交流频道......