操作系统之旅(1) - BOOT
从软盘启动开始
;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 被复制到的地址 - 偏移地址