http://blog.csdn.net/ltbylc/article/details/8309257
1. 计算机只知道01代码,计算机启动时从引导扇区开始执行,文件如下hellos.asm
- 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编译,直接生成软盘映像
- nasm -o helloos.img helloos.asm
3.使用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
- MOV BX,15
- INT 0x10
- 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. FAT12信息
FAT12是MS公司Dos所支持的文件系统之一,当软盘被标准格式化后:每个磁头80个磁道,每个磁道18个扇区,每个扇区512字节,所以标准软盘的容量为:2*80*18*512=1474560B=1440K=1.44M。文件系统数据结构为:
引导程序数据结构