30天自制OS学习笔记 (一)从计算机结构到汇编程序入门

关于OS这门课程,课堂上只是学习了一些基本的理论上的知识,希望基于《30天自制操作系统》这本书,从今天开始学习并实现一个操作系统。

(一)从计算机结构到汇编程序入门

书中一开始进入编码阶段是用的二进制编辑器将一系列超长的十六进制数输入,生成helloos.img文件。接着为了方便书写和理解程序内容,写了一个汇编程序helloos.nas来生成helloos.img文件(通过汇编语言编译器nask,nask是作者写的,跟nasm类似)。下面是helloos.nas的代码:

; hello-os
; TAB=4

; 以下这段是标准FAT12格式软盘专用的代码  (FAT12是一种文件系统)

		DB	  0xeb, 0x4e, 0x90
		DB	  "HELLOIPL" 	;启动区的名称可以是任意的字符串(8字节)
		DW	  512	        ;每个扇区(sector)的大小(必须为512字节)
		DB	  1		;簇(cluster)的大小(必须为1个扇区)
		DW 	  1		;FAT的起始位置(一般从第一个扇区开始)
		DB        2	     ;FAT的个数(必须为2)
		DW	  224		    ;根目录的大小(一般为224项)
		DW	  2880		    ;该磁盘的大小(必须是2880扇区)
		DB	  0xf0		    ;磁盘的种类(必须是0xf0)
		DW	  9				;FAT的长度(必须是9扇区)
		DW	  18			;一个磁道(track)有几个扇区(必须是18)
		DW        2				;磁头数(必须是2)
		DD	  0				;不使用分区,必须是0
		DD	  2880			;重写一次磁盘大小
		DB	  0,0,0x29		;意义不明,固定
		DD	  0xffffffff    	;(可能是)卷标号码
		DB	  "HELLO-OS   "  ;磁盘的名称(11字节)
                DB	  "FAT12   "     ;磁盘格式名称(8字节)
                RESB      18	             ;先空出18字节		

; 程序主体
		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	        ;两个换行
		DB	  "hello, word" 
		DB	  0x0a
		RESB      0x1fe-$		;填写0x00,直到0x1fe
		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

这些代码就是一开始在二进制编辑器中输入的内容,方便理解和书写,可以一一对应起来。
二进制编辑器输入的内容,也就是helloos.img
DB指令是“data byte”的缩写,往文件中写入一个字节数据。DB指令也可以用来写字符串,如DB “hello word” ,在写字符串时,汇编语言会自动地查找字符串中每一个字符所对应的编码,然后把他们一个字节一个字节的排列起来。

DW指令和DD指令,它们分别是Data word 和Data Double-word的缩写,word指16位的意思也就是2个字节,double-word是32位,也就是4个字节。

RESB指令是reserve byte的缩写,如果想要从现在的地址空出10个字节来,就可以写成RESB 10,意思是我们预约了这10个字节,而且nask不仅是把指定的地址空出来,它还会在空出来的地址上自动填入0x00。

RESB 0x1fe-$ ,$ 是一个变量,可以告诉我们这一行现在的字节数,如果前面已经输出了132字节,那这里的$就是132。

这里用到 $的原因是该扇区的最后两个字节即511、512字节必须是55、aa。
那为什么要必须是55、aa呢? 答案是:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值