恩,这是一个自己的小梦想,虽然很大程度上仍然是仿制,但是如果真能做到作者的那个水平那我该是有多高兴。
第一步,学着制作引导扇区,也是于渊的《自己动手写操作体统》的开篇内容,把两者的代码杂糅了一下,写了一个自己看着还算舒服的,也算启动成功,算是迈出的一第一步吧,千里之行始于足下~
org 7c00h
jmp start
nop
db 'nVIDIA ' ;BS_OEMName,厂商名,8字节
dw 0x200 ;BPB_BytsPerSec,每扇区字节数,2字节
db 0x01 ;BPB_SecPerSec,每簇扇区数,1字节
dw 0x01 ;BPB_RsvdSecCnt,boot记录占用多少扇区,2字节
db 0x02 ;BPB_NumFATs,共有多少FAT表,1字节
dw 0xe0 ;BPB_RootEntCnt,根目录文件数最大值,2字节
dw 0xb40 ;BPB_TotSec16,扇区总数,2字节
db 0xf0 ;BPB_Media,介质描述符,1字节
dw 0x09 ;BPB_FATSz16,每FAT扇区数,2字节
dw 0x12 ;BPB_SecPerTrk,每磁道扇区数,2字节
dw 0x02 ;BPB_NumHeads,磁头数,2字节
dd 0x0 ;BPB_HiddSec,隐藏扇区数,4字节
dd 0xb40 ;BPB_TotSec32,4字节,如果BPB_TotSec16是0,由这个值记录扇区总数
db 0 ;BPB_DrvNum,中断13的驱动器号,1字节
db 0 ;BS_Reserved1,未使用,1字节
db 0x29 ;BS_BootSig,扩展引导标记,1字节
dd 0 ;BS_VolD,卷序列号,4字节
db 'catOS ';BS_VolLab,卷标,11字节
db 'FAT12 ' ;BS_FileSysType,文件系统类型,8字节
start:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
print_message:
mov bp,msg
mov cx,msg_length
mov dx,0
mov bh,0
mov al,1
mov bl,10
mov ah,13h
int 10h
;BIOS 10h号中断
;ah=13h,用于显示字符串
;es:bp指向串地址
;cx=串长度
;dh,dl=起始行列
;bh=页号
;al=1,bl=属性时显示方式为串:char,char,char...且光标跟随移动
finish:
jmp $
msg:
db 'hello catOS'
msg_length equ $-msg
times 510-($-$$) db 0
dw 0x55aa
不过在心中仍然留下了一些疑问。
1.在《30天》中作者开篇就引入了FAT12格式,不知这样做有何用意,或许以后会用?
2.我记得0x55aa是作为引导扇区的结束符而存在,也就是说没有这个的话BIOS不会认为这个扇区是引导扇区,但是在编程的过程中,第一次我忘了加上这结束符,但是在VMware仍然按照期望的方式运行了,感觉有些奇怪。
在寻求第二个问题的答案中,发现0xaa55与0x55aa都会被认为是引导扇区的结束标志,但是疑问本身最后还是没有得到解决。
马艺婕,很对不起啦。。。