!boot.s bootsect.s框架
.globl begtext,begdata,begbss,endtext,enddata,endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSECT = 0x07c0
SETUPLEN = 4
SETUPSEG = 0x0c20
CYLS = 10
entry start
start:
jmpi go,BOOTSECT
go:
mov ax,cs
mov ds,ax
mov ax,#0x0800 !磁盘内容加载起始地址c0-h0-s2,启动扇区c0-h0-s1 有bios加载
mov es,ax
!读取下一个512字节
!启动扇区是由bios来加载的,所以我们只需要加载剩下的扇区就行
!es 已经在前面设置过 line=22
load_setup:
xor dx,dx !DH 0,DL 0
mov cx,#0x0002 !CH 0, CL 2
mov bx,#0x0200 !读取到内存的位置
mov ax,#0x0200+SETUPLEN !AH 02,AL 4 一次读取4个扇区
int 0x13
jnc ok_load_setup
xor dx,dx !重启软盘
xor ax,ax
int 0x13
j load_setup
ok_load_setup:
! ah = 0x08 dl = 驱动器号(如果是硬盘则要置位7 为1)。
! 返回信息:
! 如果出错则CF 置位,并且ah = 状态码。
! ah = 0, al = 0, bl = 驱动器类型(AT/PS2)
! ch = 最大磁道号的低8 位,cl = 每磁道最大扇区数(位0-5),最大磁道号高2 位(位6-7)
! dh = 最大磁头数, dl = 驱动器数量,
! es:di -.. 软驱磁盘参数表。
xor dl,dl
mov ah,#0x08
int 0x13
xor ch,ch !我们实质获取的是每磁道扇区个数 cl
seg cs
mov sectors,cx !ch sectors,cl track
!mov ax,#INITSET bootsect 自搬移地址
!mov es,ax !因为上面去磁盘参数中断改了es的值
! Print some inane message
mov ah,#0x03
xor bh,bh
int 0x10
mov cx,#9
mov bx,#0x0007
mov bp,#msg1
mov ax,#0x1301
int 0x10
!加载system代码
!即保护模式汇编,先不写
! mov ax,#SYSSEG
! mov es,ax ! segment of 0x010000
! call read_it
! call kill_motor
!查找文件系统所在位置
!先略过
!跳转到setup中执行
! jmpi 0,SETUPSEG
fin:
jmp fin
!用于记录信息
sectors:
.word 0
msg1:
.byte 13,10
.ascii "Leading"
.org 510
.word 0xaa55
.text
endtext:
.data
enddata:
.bss
endbss:
//真的是历经千辛万苦但是给挂了,看Linux-0.0.2也没有写fat12的文件格式,运行的不是好好的嘛。 苦思中。。。
//写一个操作系统太耗时了,基本从中午2点到晚上两点,还么打通一关,关键是好久没写汇编了,伤心
//现在把bootsetc.S 基本上给读懂了,发布下给大家参考