1. 計算機只知道01代碼,計算機啓動時從引導扇區開始執行,文件如下hellos.asm
(2013.04.07 自己用二進制代碼構築一個引導扇區,具體構成見下圖二)
DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
RESB 16 ;預留空間指令
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 368
DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
2. 使用nasm編譯(80x86彙編編譯器http://sourceforge.net/projects/nasm/),直接生成軟盤映像
nasm -o helloos.img helloos.asm
3.使用bochs(80x86模擬器http://sourceforge.net/projects/bochs/)可虛擬運行,helloos.bxrc
romimage: file=$BXSHARE\BIOS-bochs-latest, address=0xf0000
megs: 16
vgaromimage: $BXSHARE\VGABIOS-lgpl-latest
floppya: 1_44=helloos.img, status=inserted
boot: a
log: bochsout.txt
parport1: enable=0
vga_update_interval: 300000
keyboard_serial_delay: 200
keyboard_paste_delay: 100000
floppy_command_delay: 50000
ips: 4000000
mouse: enabled=0
private_colormap: enabled=0
fullscreen: enabled=0
screenmode: name="sample"
i440fxsupport: enabled=0
4. helloos1.asm=helloos.asm
;FAT12格式文件系統頭部分
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB 18
;程序主體
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
;顯示信息部分
DB 0x0a, 0x0a
DB "hello, world"
DB 0x0a
DB 0
;原書中使用下面指令,但這個在nasm中不通過,故使用times
;RESB 0x1fe - $
;times 0x1fe - ($ - $$) DB 0
times 510 - ($-$$) DB 0
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
5. helloos2.asm=helloos1.asm
ORG 0x7c00 ;程序加載到內存的位置
JMP entry
DB 0x90 ;模擬磁盤扇區
DB "HELLOIPL"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
RESB 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
CMP AL,0 ;到字符串最後了
JE fin
MOV AH,0x0e ;AH=0ex,AL=顯示字符
MOV BX,15 ;BH=0,BL=顏色代碼
INT 0x10 ;BIOS顯示中斷
JMP putloop
fin:
HLT ;停機指令
JMP fin ;死循環
msg:
DB 0x0a, 0x0a
DB "hello, world"
DB 0x0a
DB 0
;RESB 0x7dfe-$
;times 0x7dfe - ( $ - $$ ) DB 0
times 510-($-$$) DB 0
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
6. 寄存器
16位寄存器
AX:Accumulator,累加寄存器
BX:Base,基址寄存器
CX:Counter,計數寄存
DX:Data,數據寄存器
SP:StackPointer,棧指針寄存器
BP:BasePointer,基址指針寄存器
SI:SourceIndex,源變址寄存器
DI:DestintionIndex,目的變址寄存器
ES:ExtraSegment,附加段寄存器
CS:CodeSegment,代碼段寄存器
SS:StackSement,棧段寄存器
DS:DataSegment,數據段寄存器
FS:
GS:
7. FAT12信息
FAT12是MS公司Dos所支持的文件系統之一,當軟盤被標準格式化後:每個磁頭80個磁道,每個磁道18個扇區,每個扇區512字節,所以標準軟盤的容量爲:2*80*18*512=1474560B=1440K=1.44M。(圖一:文件系統數據結構)爲:
(圖二:引導程序數據結構)