自制操作系统2-汇编语言学习与Makefile入门

2 汇编语言学习与Makefile入门

2020.10.15

第二天的任务也比较轻松,主要是学习汇编语言知识,和学会使用Makefile批处理文件。

1. 文本编辑器

Notepad++

2. 继续开发

文档:helloos3

; hello-os
; TAB=4

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

; 以下的记述用于标准FAT12格式的软盘

		JMP entry
		DB 0x90

---(中略)---

; 程序核心

entry:
		MOV AX,0 		; 初始化寄存器
		MOV SS,AX
        MOV SP,0x7c00
        MOV DS,AX
        MOV ES,AX
        
        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 "hello, world"
        DB 0x0a 		; 换行
        DB 0

这里的主要是巩固汇编语言的知识,因为我已经学过了王爽的汇编语言,所以这里过的很快。

ORG(Origin):告诉NASK,开始执行的时候,把这些机器语言指令装载到内存中的哪个位置

启动区内容的装载地址:0x07c00-0x07dff

0x7c00的故事:

​ 从计算机制造者IBM说起,0x7c00的前身是0x200,当时操作系统是在1980年出现的SCP的“86-DOS”,这个系统是从0x400开始放置的,而中断向量表中0x000-0x3ff中的后半部分0x200-0x3ff的保留空间并没有被用到,所以刚好利用了这512B的缝隙。

那后来0x7c00又是怎么来的呢?它的第一次出现是在1981年的IBM PC机5150上,当时为了尽量让最多的连续内存空间分配给操作系统,选择把MBR(Master Boot Record主引导记录——计算机开机以后访问硬盘所必要要读取的第一个扇区)放在内存的最高端,另外还需要512B的堆栈/数据空间,因此从内存的最高处往下推,MBR的存放位置就由此而来了。

​ 0x7c00=0x7dff(5150机器总内存空间32KB)-512B(堆栈/数据空间)-512B(MBR空间)

为什么要把MBR放在高端呢?计算机启动起来以后,堆栈/数据空间,MBR区就不再需要了,这部分内存可以被操作系统再次回收利用。如果把这部分内存放在低端就很难再被利用起来,因为程序一般都是往高地址空间方向发展的。

参考资料:Why BIOS loads MBR into 0x7C00 in x86 ?

BIOS(Basic Input Output System):电脑厂家预先写入操作系统开发人员经常会用到的一些程序,如今的BIOS功能非常多,可以看作为操作系统开发人员准备的各种函数的集合。而INT就是调用这些函数的指令。

HLT:让CPU停止,等待指令。即使不加HLT指令,程序也能在JMP fin无限循环,但加入HLT能让CPU进入待机状态,可以省电ORZ(节能环保,从我做起)。

3. 制作启动区

文档:helloos4

IPL(Initial Program Loader):启动程序加载器,加载操作系统的程序

只有512字节

4. Makefile入门

Makefile就是一个批处理文件,需要调用make.exe来让Makefile发挥作用

  • 命令源文件不存在时,会找源文件的生成方法
  • 目标文件存在时会判断文件的更新日期
  • 目标文件存在且无需更新,则不执行命令;需要更新时,则执行命令
# 默认动作(使用make命令时,默认使用img命令)

default :
	../z_tools/make.exe img

# 文件生成规则

ipl.bin : ipl.nas Makefile
	../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img : ipl.bin Makefile
	../z_tools/edimg.exe   imgin:../z_tools/fdimg0at.tek \
		wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

# 命令

asm :
	../z_tools/make.exe -r ipl.bin

img :
	../z_tools/make.exe -r helloos.img

run :
	../z_tools/make.exe img
	copy helloos.img ..\z_tools\qemu\fdimage0.bin
	../z_tools/make.exe -C ../z_tools/qemu

install :
	../z_tools/make.exe img
	../z_tools/imgtol.com w a: helloos.img
	
	#清理中间生成文件
clean :
	-del ipl.bin
	-del ipl.lst
	
	#清理除源文件以外的文件
src_only :
	../z_tools/make.exe clean
	-del helloos.img

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lor :)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值