day1:
二进制编辑器bz:https://www.vcraft.jp/soft/bz.html
初识机器语言和汇编语言,并分别用其实现了软盘映像文件(完全用作者的复制粘贴)。
二进制编辑器中输入内容如下:
只有图中部分有非0内容,其余部分均为0,最末行首地址是001440。
保存为helloos.img,即为一个极简的二进制的软盘映像文件。
没有软盘可以用作者提供的模拟器。
创建run.bat,内容:
copy helloos.img ..\z_tools\qemu\fdimage0.bin ..\z_tools\make.exe -C ../z_tools/qemu
打开cmd进入helloos.img所在目录,运行run.bat
day2:
2.1作者推荐文本编辑器
TeraPad:
NotePad++:http://notepad-plus-plus.org/
2.2相关指令介绍
helloos.nas节选
点击查看代码
; 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
HLT:CPU停止动作,处于休眠状态,外部发生变化之后CPU就会继续执行程序。
ORG:指定把程序装载入内存的具体地址,使用ORG指令时要注意,不是所有的内存地址都可以使用,有一部分是BIOS程序和中断向量表,ORG的目的操作数不能在这些部分的范围内。内存中无法使用的部分具体取决于我们电脑的出厂设置。
内存:CPU的存储能力很差,内存看作CPU的外部存储器。
2.3制作启动区
启动区仅需要最初的512字节,故只保留helloos.nas最初的512字节,并将其文件名改为ipl.nas
ipl.nas内容如下:
点击查看代码
; hello-os
; TAB=4
ORG 0x7c00 ; 程序载入内存的地址
; 以下是标准FAT12格式软盘的记述
JMP entry
DB 0x90
DB "HELLOIPL" ; 引导扇区的名称,可更改(8字节)
DW 512 ; 规定一个扇区的大小(512字节)
DB 1 ; 群集(又称“簇”)大小,必须为一个扇区
DW 1 ; FAT从哪里开始(一般从第一个扇区开始)
DB 2 ; FAT个数(必须为2)
DW 224 ; 根目录区域的大小(通常为224个条目)
DW 2880 ; 此驱动器的大小(必须为2880个扇区)
DB 0xf0 ; 介质类型(?)(必须为0xf0)
DW 9 ; FAT长度(必须为9个扇区)
DW 18 ; 一个磁道有多少个扇区(必须是18)
DW 2 ; 头数(是磁盘头吗?)(必须为2)
DD 0 ; 因为没有使用分区,所以这里一定是0
DD 2880 ; 再写一次这个驱动器的大小
DB 0,0,0x29 ; 价格(?
DD 0xffffffff ; 卷序列号
DB "HELLO-OS " ; 磁盘名(共11字节)
DB "FAT12 " ; 磁盘格式是FAT12(共8字节)
RESB 18 ; 连续18个字节的0
; 程序主体
entry:
MOV AX,0 ; 通用寄存器AX初始化
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
putloop:
MOV AL,[SI]
ADD 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 ; 两个换行符
DB "hello, world"
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 从当前地址到地址0x7dfe用0x00填充
DB 0x55, 0xaa
FAT:文件记录表,记录每个文件的各个数据块存放在磁盘的哪个位置。
簇:文件系统用来组织和管理磁盘空间的基本分配单位。一个群集由若干连续的扇区组成。
卷序列号:为每个卷提供一个唯一的标识符,使得操作系统能够区分不同的存储设备和分区。
2.4makefile入门
首先新建一个文本文件,并输入以下内容:
点击查看代码
#文件生成规则
ipl.bin : ipl.nas Makefile #目标:依赖
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst #需要执行的命令
helloos.img : ipl.bin Makefile #最终生成的镜像文件名为helloos.img,依赖是ipl.bin和Makefile
../z_tools/edimg.exe #使用工具edimg.exe,加载fdimg0at.tek文件作为基础镜像
imgin:../z_tools/fdimg0at.tek \ #将ipl.bin文件的前512个字节读入fdimg0at.tek中,写入fggimg0at.tek时从字符偏移量0开始,即文件开头开始写
wbinimg src:ipl.bin len:512 from:0 to:0
imgout:helloos.img #将得到的镜像文件保存为helloos.img
makefile文件相当于将需要的gcc指令集成到一个脚本中。 每个mekefile规则一般由三部分组成:
目标:本规则最后得到的文件。
依赖:实现目标需要的前提文件或目标。Makefile的执行过程不是基于语句顺序的,而是基于依赖链的顺序的。
命令:实现目标需要执行的一系列命令,通过这一系列命令,可以使依赖形成目标。
作者给出的完整makefile如下,:
点击查看代码
# 默认动作
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
cp 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 :
-rm -f ipl.bin
-rm -f ipl.lst
src_only :
../z_tools/make.exe clean
-rm -f helloos.img