You are on page 1of 3

DAY 2 helloos.

asm

; hello-os

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

; 用于标准 FAT12 格式的软盘


JMP entry ; 跳转指令
NOP ; NOP 指令(0x90)
DB "HELLOIPL" ; OEM 标识符(8 字节)
DW 512 ; 每个扇区(sector)的字节数(必须为 512 字
节)
DB 1 ; 每个簇(cluster)的扇区数(必须为 1 个扇
区)
DW 1 ; FAT 的预留扇区数(包含 boot 扇区)
DB 2 ; FAT 表的数量,通常为 2
DW 224 ; 根目录文件的最大值(一般设为 224 项)
DW 2880 ; 磁盘的扇区总数,若为 0 则代表超过 65535 个
扇区,需要使用 20 行记录
DB 0xf0 ; 磁盘的种类(本项目中设为 0xf0 代表 1.44MB
的软盘)
DW 9 ; 每个 FAT 的长度(必须为 9 扇区)
DW 18 ; 1 个磁道(track)拥有的扇区数(必须是 18)
DW 2 ; 磁头数(必须为 2)
DD 0 ; 隐藏的扇区数
DD 2880 ; 大容量扇区总数,若 14 行记录的值为 0 则使用
本行记录扇区数
DB 0 ; 中断 0x13 的设备号
DB 0 ; Windows NT 标识符
DB 0x29 ; 扩展引导标识
DD 0xffffffff ; 卷序列号
DB "HELLO-OS " ; 卷标(11 字节)
DB "FAT12 " ; 文件系统类型(8 字节)
RESB 18 ; 空 18 字节

; 程序核心

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 ; 两个换行
DB "hello, world"
DB 0x0a ; 换行
DB 0

RESB 0x1fe - ($ - $$) ; 填写 0x00,直到 0x001fe


DB 0x55, 0xaa
DAY 2 Makefile

all:
nasm helloos.asm -o helloos.bin -l helloos.lst
dd if=/dev/zero of=helloos.img bs=512 count=2880
dd if=helloos.bin of=helloos.img bs=512 count=1 conv=notrunc

clean:
rm -rf helloos.bin helloos.img

qemu: all
qemu-system-i386 -fda helloos.img -gdb tcp::1234 -S

.PHONY:
all

You might also like