30天自制操作系统第二天
2020-09-05 本文已影响0人
岳麓山鸡王
; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序的装载地址
; 以下的记述用于标准FAT12格式的软盘
JMP entry
DB 0x90
DB "HELLOIPL" ; 可以自由写扇区的名字(8字节)
DW 512 ; 1扇区的大小(必需要512)
DB 1 ; 集群的大小(必需要做一个扇区)
DW 1 ; FATA从这里开始(一般是从第一扇区开始)
DB 2 ; FATA的个数(必须是2)
DW 224 ; 根目录区域的大小(通常为224项)
DW 2880 ; 该驱动器的大小(必须要为2880扇区)
DB 0xf0 ; 媒体类型(必须要做0 xf0)
DW 9 ; FATO区域的长度(必须要做9扇区)
DW 18 ; 1卡车上有几个扇区
DW 2 ; 头数(必须要2)
DD 0 ; 因为没有使用分区,所以这里一定是0
DD 2880 ; 再写一次一个寄存器大小
DB 0,0,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 0x7dfe-$ ; 到0x7dfe在0x00中填入的命令
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
八个寄存器 ABCD SBSD
AX——accumulator,累加寄存器
CX——counter,计数寄存器
DX——data,数据寄存器
BX——base,基址寄存器
SP——stack pointer,栈指针寄存器
BP——base pointer,基址指针寄存器
SI——source index,源变址寄存器
DI——destination index,目的变址寄存器
这些寄存器全都是16位寄存器,因此可以存储16位的二进制数。
8个段寄存器
ES——附加段寄存器(extra segment)
CS——代码段寄存器(code segment)
SS——栈段寄存器(stack segment)
DS——数据段寄存器(data segment)
FS——没有名称(segment part 2)
GS——没有名称(segment part 3)