📄 boot.asm
字号:
;文件名: boot.asm
;作 者; 谢煜波
;Emailv: xieyubo@126.com
;
;内存分配如下
;内存起始地址为 0x90000
;最大结束地址为 0x9ffff
;最大共 64KB
;所有启动代码在一个段内,方便调用
;启动代码共分两部分,一是boot,一是setup,这点照搬linux 0.11的设计
;但与其不同的是,boot不会将自己搬到0x90000处,而直接跳到 0x90100处运行
;0x90000~0x900ff (256B) 系统保留来存放一些从BIOS中取出的关键数据
;0x90100~0x904ff (1KB):此处开始存放setup,setup大小为1KB
[BITS 16] ;编译成16位的指令
[ORG 0x7C00]
;----------------------------------------------------------------------------------------------
jmp Main
;----------------------------------------------------------------------------------------------
;数据定义
MSG db "Loading pyos ..." ;输出信息
db 13 , 10 , 0 ;13表示回车,10表示换行,
;0表示字符串结束
BOOTSEG equ 0x0000 ;boot所在的段基址
SETUPSEG equ 0x9000 ;setup所在的段基址
SETUPOFFSET equ 0x0100 ;setup所在的偏移量
SETUPSIZE equ 1024 ;setup的大小,必须是512的倍数
BOOTDRIVER db 0 ;保存启动的驱动器号
;----------------------------------------------------------------------------------------------
ShowMessage:
;以下程序行为显示输出信息
mov ah , 0x0e ;设置显示模式
mov bh , 0x00 ;设置页码
mov bl , 0x07 ;设置字体属性
.nextchar:
lodsb
or al , al
jz .return
int 0x10
jmp .nextchar
.return:
ret
;-----------------------------------------------------------------------------------------------
Main:
mov [BOOTDRIVER] , dl ;得到启动的驱动器号
;以下程序设置数据段
mov ax , BOOTSEG
mov ds , ax
mov si , MSG
call ShowMessage ;显示信息
;读入setup
;从磁盘的第二个扇区读到0x90100处
.readfloopy:
mov ax , SETUPSEG
mov es , ax
mov bx , SETUPOFFSET
mov ah , 2
mov dl , [BOOTDRIVER]
mov ch , 0
mov cl , 2
mov al , SETUPSIZE / 512 ;读入扇区数( 2个共1KB )
int 0x13
jc .readfloopy
;把启动驱动器号保存在0x90000处
mov al , [BOOTDRIVER]
mov [0] , al
;跳转
jmp SETUPSEG : SETUPOFFSET
;---------------------------------------------------------------------------
times 510-($-$$) db 0
db 0x55
db 0xAA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -