; hello-os
; TAB=4
ORG 0x7c00 ; 指明程序的裝載地址
; 以下的記述用于標準FAT12格式的軟盤
JMP entry
DB 0x90
DB "HELLOIPL" ; 可以自由寫扇區(qū)的名字(8字節(jié))
DW 512 ; 1扇區(qū)的大欣苁住(必需要512)
DB 1 ; 集群的大幸厣獭(必需要做一個扇區(qū))
DW 1 ; FATA從這里開始(一般是從第一扇區(qū)開始)
DB 2 ; FATA的個數(shù)(必須是2)
DW 224 ; 根目錄區(qū)域的大薪0啊(通常為224項)
DW 2880 ; 該驅(qū)動器的大幸鎏础(必須要為2880扇區(qū))
DB 0xf0 ; 媒體類型(必須要做0 xf0)
DW 9 ; FATO區(qū)域的長度(必須要做9扇區(qū))
DW 18 ; 1卡車上有幾個扇區(qū)
DW 2 ; 頭數(shù)(必須要2)
DD 0 ; 因為沒有使用分區(qū),所以這里一定是0
DD 2880 ; 再寫一次一個寄存器大小
DB 0,0,0x29 ; 雖然不太明白童芹,但是放在?個價?上就好了
DD 0xffffffff ; 大概卷序列號
DB "HELLO-OS " ; 磁盤名稱(11字節(jié))
DB "FAT12 " ; 格式名稱(8字節(jié))
RESB 18 ; 先放18個字節(jié)
; 程序核心
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 ; 調(diào)用顯卡BIOS
JMP putloop
fin:
HLT ; 讓CPU停止涮瞻,等待指令
JMP fin ; 無限循環(huán)
msg:
DB 0x0a, 0x0a ; 換行兩次
DB "hello, world"
DB 0x0a ; 換行
DB 0
RESB 0x7dfe-$ ; 到0x7dfe在0x00中填入的命令
DB 0x55, 0xaa
; 以下是非??扇區(qū)以外的部分的描述
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假褪,計數(shù)寄存器
DX——data署咽,數(shù)據(jù)寄存器
BX——base,基址寄存器
SP——stack pointer生音,棧指針寄存器
BP——base pointer宁否,基址指針寄存器
SI——source index,源變址寄存器
DI——destination index久锥,目的變址寄存器
這些寄存器全都是16位寄存器家淤,因此可以存儲16位的二進制數(shù)异剥。
8個段寄存器
ES——附加段寄存器(extra segment)
CS——代碼段寄存器(code segment)
SS——棧段寄存器(stack segment)
DS——數(shù)據(jù)段寄存器(data segment)
FS——沒有名稱(segment part 2)
GS——沒有名稱(segment part 3)