; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序的装载地址
; 以下这段是标准FAT32格式软盘专用的代码
JMP entry
DB 0x90
DB "HELLOIPL" ; freeparam 启动区的名称可以是任意的字符串(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 ; 1个磁道(track)有几个扇区(必须是18)
DW 2 ; 磁头数(必须是2)
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明,固定
DD 0xffffffff ; (可能是)卷标号码
DB "HELLO-OS " ; freeparam 磁盘的名称(11字节)
DB "FAT12 " ; 磁盘格式名称(8字节)
RESB 18 ; 先空出18字节
; 程序核心
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00 ;0x7c00到0x7dff为启动区内容的装载地址
MOV DS,AX ;DS必须指定为0,因为它是默认的段寄存器,地址的值会加上这个值的16倍
putloop:
MOV AL,[SI]
ADD SI,1 ; 给SI加1
CMP AL,0
JE fin
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜 {MOD}
INT 0x10 ; 调用显卡BIOS
JMP putloop
fin:
HLT ; 让CPU停止;等待指令
JMP fin ; 无限循环
msg: ; 信息显示部分
DB 0x0a, 0x0a ; 换行2次
DB "hello, world!" ; freeparam
DB 0x0a ; 换行
DB 0
RESB 0x7dfe-$ ; 填写0x00,直到0x001fe,是为了保证第510字节(即第0x1fe字节)开始的地
方是55AA
DB 0x55, 0xaa ;如果启动区最后2字节不是0x55aa,计算机会认为盘上没有需要启动的程序。
制作一个不带扩展名的文件 “Makefile”,写入以下内容:
default :
../z_tools/make.exe img
#制作文件ipl.bin
ipl.bin : ipl.nas Makefile #要制作文件ipl.bin,需先检查ipl.nas和Makefile这两个文件是否准备好
../z_tools/nask.exe ipl.nas ipl.bin ipl.lst
#制作文件 helloos.img
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_toolsqemufdimage0.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
这样,asm.bat,run.bat,install.bat都可以删掉了。 ..z_toolsmake.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
双击!cons_nt.bat,输入make_run