引导扇区

看了于谦的书,一直想写个操作系统玩玩。代码写了一部分。现在开始总结一下。启动pc的时候,这个时候bios处于控制权。 它将第0个磁道第0个扇区加载到地址0x7c00处, 这个叫做引导扇区。但是记住这个扇区一定要0xaa55结尾。代码如下:

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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值