; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序装载地址
;因为内存地址0是用来保存BIOS程序的,所以必须向后延长,所以伟大的开发们就定义了0x7C00
; 以下是记叙标准FAT12格式软盘
JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区名称可以是任意的字符串
DW 512 ; 每个扇区的大小必须是512
DB 1 ; 簇大小必须一个扇区
DW 1 ; FAT起始位置(一般为第一个扇区开始)
DB 2 ; FAT的个数
DW 224 ; 根目录大小
DW 2880 ; 磁盘大小
DB 0xf0 ; 硬盘种类
DW 9 ; FAT长度
DW 18 ; 一个磁道几个扇区
DW 2 ; 磁头数
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明,固定写法
DD 0xffffffff ; 卷标号码
DB "HELLO-OS " ; 磁盘名称
DB "FAT12 " ; 磁盘格式名称
RESB 18 ; 先空出18个字节
; 程序主体
entry:
MOV AX,0 ; 初始化寄存器
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg ; 将msg初始地址写入SI
putloop: ;经过一系列循环,利用SI指针将msg中的字符打印出来
MOV AL,[SI]
ADD SI,1 ; SI加1
CMP AL,0
JE fin
MOV AH,0x0e ; 显示一个文字
MOV BX,15 ; 指定字符颜色
INT 0x10 ; 调用显卡BIOS,在这里预先写入操作系统开发人员经常用到的程序,超级方便,BIOS(basic input output system)后面的数字代表调用不同的函数
;INT是BIOS程序,出厂就固定到主板上面,
JMP putloop
fin: ;程序运行完成后就开始等待
HLT ; CPU停止,等待,降低功耗
JMP fin ; 无线循环
msg: ;这里就是要显示的字符 __hello,world_
DB 0x0a, 0x0a ; 换行*2
DB "hello, world"
DB 0x0a ; 改行
DB 0
RESB 0x7dfe-$ ; 直接跳转到
; RESB指令是“reserve byte”的略写预约字节。
; 如果想要从当前位置向后空出10个字节来,并且填0,如果后面
; 18万行全是0x00的话 使用本命令可以省去填写18万行0x00时间
; 例子:
; RESB 10
; DB 0
; RESB 0x1f0-$ 填写从0x00到0x1f0的数据;
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