小言_互联网的博客

30天自制操作系统_day01

349人阅读  评论(0)

操作系统boot的3中不同表现

Type1 十六进制

Type2 汇编

	DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
	DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
	DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
	DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
	DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
	DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
	RESB	16
	DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
	DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
	DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
	DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
	DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
	DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
	DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	368
	DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	4600
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	1469432

Type3 伪指令汇编语言

; hello-os
; TAB=4

; 以下这段是FAT12格式软盘专用代码

		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		; 启动盘可以是任意的字符串(8字节)
		DW		512				; 磁盘扇区(sector)字节数
		DB		1				; 磁盘每簇扇区数
		DW		1				; 保留区扇区数
		DB		2				; FAT(文件分配表)数量
		DW		224				; 根目录下的文件最大数量
		DW		2880			; 文件系统扇区总数, 2880个扇区为1.44Mb,
                   			    ; 扇区数若超过65535,则此处为0, [32,35]偏移处为文件系统扇区总数。
		DB		0xf0			; 文件系统所在存储介质类型, 0xf0表示可移动介质
		DW		9				; 一个FAT所占扇区数
		DW		18				; 每磁道(track)扇区数
		DW		2				; 磁头数(必须为2)
		DD		0				; 无隐藏扇区(若有则在保留区域前)
		DD		2880			; 重写一次磁盘大小/文件系统所占扇区数
		DB		0,0,0x29		; BIOS int 13h磁盘号; 保留未使用; 0x29表示下一个值才表示卷数
		DD		0xffffffff		; 卷数(卷序列号)
		DB		"HELLO-OS   "	; 用作卷标, 磁盘名称
		DB		"FAT12   "		; 用作文件系统类型标签
		RESB	18				; 在描述FAT12文件系统概样之后填充18字节0(之后便从80字节处开始)

; 程序主体

		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd

; 信息显示部分

		DB		0x0a, 0x0a		; 2个换行
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x1fe-$			; 填写0x00直到0x001fe

		DB		0x55, 0xaa

; 启动盘以外部分的输出

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

对比这三个一个程序的三种不同表现形式,我们可以看到对于我们程序员,汇编其实已经很棒了,不过复杂的指令集任然让我们不能完成更多更好的工作,所以才有了C,python,Java

汇编的注意点

db(define byte):定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1

dw(Data Warehouse):定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2

dd(DoubleWord):定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4

RESB(reservebyte):想要从现在的地址开始空出10个字节来,就可以写成RESB10,意思是我们预约了这10个字节

ESB0x1fe- 132 :告诉我们这一行现在的字节数。在这个程序里,我们已经在前面输出了132字节,所以这里的 就是132。因此nask先用0x1fe减去132,得出378这一结果,然后连续输出378个字节的0x00

其他信息:

CPU的本质

最早人们发明CPU只是为了处理电信号,那个时候没有人能想到它后来会成为这么有用的机器。后来,我们发现只要给每个文字都编上号(即文字编码),就可以建立一个文字与数字的对应关系,从而就可以把文字也转换成电信号,让CPU来处理文章(比如进行文字输入或者字词检索等)。依此类推,人们接着又找到了将图像、音乐等等转换成电信号的方法,使CPU的应用范围越来越广。不过CPU还是一如既往,只能处理电信号。

对于现在的计算机可到达的众多效果,似乎真的难以想象竟然是电信号的跳跃


转载:https://blog.csdn.net/weixin_43485772/article/details/105927459
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场