引导扇区

来源:互联网 发布:android购物源码 编辑:程序博客网 时间:2024/05/01 06:13
看了于谦的书,一直想写个操作系统玩玩。代码写了一部分。现在开始总结一下。启动pc的时候,这个时候bios处于控制权。 它将第0个磁道第0个扇区加载到地址0x7c00处, 这个叫做引导扇区。但是记住这个扇区一定要0xaa55结尾。代码如下:

org 0x7c00jmp LABEL_START%include "Include/Func.inc"LoadNamedb 'LOAD    BIN', 0 ; 这里要注意一下,fat文件系统格式,文件名分为短文件名和长文件名。短文件名为大写,不足的补上空格;根目录数据结构;+0: DIR_Name(size: 0xb);+0xb: DIR_Attr(size: 1);+0xc: 保留(size: 10);+0x16: DIR_WrtTime(size: 2);+0x18: DIR_WrtDate(size: 2);+0x1a: DIR_FsClus(size: 2)此文件开始的簇号;+0x1c: DIR_FileSize(size: 4)文件大小; 将FAT表和root目录读入内存LABEL_START:mov ax, csmov ds, axmov ss,axmov sp, 0x200push ROOT_DIR_SECNUM ; 扇区数目push ROOT_DIR_SEC ; 起始扇区号push LoadName; 查找Load.bin文件call LookForDiradd sp, 6mov [FileClusIndex], axcmp dword[FileClusIndex], 0jz $; 没有找到,死循环LABEL_LOAD_FILE_START:; 读入fat表push 0x0000push FAT_TABLE_BASE; 紧接引导扇区push FAT_SEC_NUMpush FAT_TABLE_SEC; fat表扇区号call ReadSecadd sp, 8mov bx, OffsetofLoadLABEL_LOAD_FILE_NEXT:cmp word[FileClusIndex], 0x0ff8jae LABEL_LOAD_FILE_ENDmov ax, [FileClusIndex]sub ax, 2add ax, DATA_SECpush bxpush LOAD_STARTpush 1push axcall ReadSecadd sp, 8add bx, 512push word[FileClusIndex]call FindClusIndexadd sp, 2mov [FileClusIndex], axjmp LABEL_LOAD_FILE_NEXTLABEL_LOAD_FILE_END:jmp LOAD_START: OffsetofLoadtimes 510-($-$$)db 0dw 0xaa55

注意: 这个org 0x7c00 一定要加上去。不然的话数据地址会出现错了。因为你的代码转移到了0x07c00处。而代码编译是基于地址0的。此时cs寄存器值为0。


原创粉丝点击