2 汇编语言学习与Makefile入门
2020.10.15
第二天的任务也比较轻松,主要是学习汇编语言知识,和学会使用Makefile批处理文件。
1. 文本编辑器
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