从软盘启动开始
;File Path:boot/boot.asm
;nasm -I include/ -o boot.bin boot.asm
%include "load.inc"
org 07c00h
start:
mov ax , cs
mov ds , ax
mov es , ax
mov ss , ax
mov sp , OffsetOfBoot
; 清屏
mov ax , 0600h ; AH = 6, AL = 0h
mov bx , 0700h ; 黑底白字(BL = 07h)
mov cx , 0 ; 左上角: (0, 0)
mov dx , 184fh ; 右下角: (80, 50)
int 10h ; int 10h
; 软驱复位
xor ah , ah
xor dl , dl
int 13h
;读入Loader.bin
push 10 ; 读取10个扇区
push 1 ; 起始扇区
push OffsetOfLoader ; 目的内存偏移地址
push BaseOfLoader ; 目的内存段地址
call ReadSector
add sp , 8
jmp BaseOfLoader:OffsetOfLoader
;----------------------------------------------------------------------------
; ReadSector(u16 mem_seg, u16 dst_off, u16 start_sector, u16 num_sector);
;----------------------------------------------------------------------------
ReadSector:
push bp
mov bp , sp
mov ax , [ss:bp + 4]
mov es , ax
mov bx , [ss:bp + 6]
.r1:
cmp word [ss:bp + 10] , 0
je .r2
mov ax , [ss:bp + 8]
mov cl , 18
div cl ;al - 商 ah - 余数
inc ah
mov cl , ah ;cl - 扇区号
mov ah , al
and ah , 1
mov dh , ah ;dh - 磁头号
shr al , 1
mov ch , al ;ch - 磁道号
mov dl , 0 ;dl - 驱动器号
mov ax , 0201h
int 13h
inc word [ss:bp + 8]
dec word [ss:bp + 10]
add bx , 512
jmp .r1
.r2:
pop bp
ret
times 510 - ($ - $$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
;File Path: boot/include/load.inc
BaseOfBoot equ 0000h ; 启动段地址
OffsetOfBoot equ 7c00h ; 启动偏移地址
BaseOfLoader equ 9000h ; LOADER.BIN 被复制到的地址 - 段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被复制到的地址 - 偏移地址