看了于谦的书,一直想写个操作系统玩玩。代码写了一部分。现在开始总结一下。启动pc的时候,这个时候bios处于控制权。 它将第0个磁道第0个扇区加载到地址0x7c00处, 这个叫做引导扇区。但是记住这个扇区一定要0xaa55结尾。代码如下:
注意: 这个org 0x7c00 一定要加上去。不然的话数据地址会出现错了。因为你的代码转移到了0x07c00处。而代码编译是基于地址0的。此时cs寄存器值为0。
org 0x7c00
jmp LABEL_START
%include "Include/Func.inc"
LoadName db '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, cs
mov ds, ax
mov ss, ax
mov sp, 0x200
push ROOT_DIR_SECNUM ; 扇区数目
push ROOT_DIR_SEC ; 起始扇区号
push LoadName ; 查找Load.bin文件
call LookForDir
add sp, 6
mov [FileClusIndex], ax
cmp dword[FileClusIndex], 0
jz $ ; 没有找到,死循环
LABEL_LOAD_FILE_START:
; 读入fat表
push 0x0000
push FAT_TABLE_BASE ; 紧接引导扇区
push FAT_SEC_NUM
push FAT_TABLE_SEC ; fat表扇区号
call ReadSec
add sp, 8
mov bx, OffsetofLoad
LABEL_LOAD_FILE_NEXT:
cmp word[FileClusIndex], 0x0ff8
jae LABEL_LOAD_FILE_END
mov ax, [FileClusIndex]
sub ax, 2
add ax, DATA_SEC
push bx
push LOAD_START
push 1
push ax
call ReadSec
add sp, 8
add bx, 512
push word[FileClusIndex]
call FindClusIndex
add sp, 2
mov [FileClusIndex], ax
jmp LABEL_LOAD_FILE_NEXT
LABEL_LOAD_FILE_END:
jmp LOAD_START: OffsetofLoad
times 510-($-$$) db 0
dw 0xaa55
注意: 这个org 0x7c00 一定要加上去。不然的话数据地址会出现错了。因为你的代码转移到了0x07c00处。而代码编译是基于地址0的。此时cs寄存器值为0。