📄 boot.asm
字号:
[BITS 16] ;;编译成16位的指令
[ORG 0x7C00]
;----------------------------------------------------------------------------------------------
jmp main
;----------------------------------------------------------------------------------------------
MSG db "booting pyos from boot.asm ..." , 13 , 10 , 0
BOOT_DRIVER db 0 ;;保存启动的驱动器号
VESA:
times 256 db 0
;----------------------------------------------------------------------------------------------
read_setup: ;;读入 setup 程序
push es
.read_setup_1
mov ax , 0x1000 ;;setup.asm 所在的段基址
mov es , ax
mov bx , 0
mov ah , 2
mov dl , [ BOOT_DRIVER ]
mov ch , 0
mov cl , 2
mov al , 2 ;;读入扇区数,每个扇区为 512B
int 0x13
jc .read_setup_1
pop es
ret
;----------------------------------------------------------------------------------------------
save_boot_driver:
push es
mov ax , 0x8000 ;;系统数据区的段基址
mov es , ax
mov al , [ BOOT_DRIVER ]
mov [ es:0 ] , ax
pop es
ret
;----------------------------------------------------------------------------------------------
show_message:
mov si , MSG
mov ah , 0x0e ;;设置显示模式
mov bh , 0x00 ;;设置页码
mov bl , 0x07 ;;设置字体属性
.nextchar:
lodsb
or al , al
jz .show_message_end
int 0x10
jmp .nextchar
.show_message_end:
ret
;----------------------------------------------------------------------------------------------
open_a_20: ;;打开 A 20 地址线的子程序
mov ax , 0x2401
int 0x15 ;;通过 0x2401 中断号调用 BIOS
;;0x15 中断完成,这被现代的 BIOS 支持
ret
;--------------------------------------------------------------------------------------------------------
main: ;;主程序
mov ax , 0x0 ;;boot.asm 程序的段基址
mov ds , ax
mov [ BOOT_DRIVER ] , dl ;;得到启动的驱动器号
call open_a_20 ;;打开 a20 地址线
call save_boot_driver ;;保存驱动器号
call show_message ;;显示启动信息
call read_setup ;;读入 setup 程序
jmp dword 0x1000:0 ;;跳转到 setup 处执行
;---------------------------------------------------------------------------
times 510-($-$$) db 0
db 0x55
db 0xAA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -