操作系统之旅(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 被复制到的地址 - 偏移地址

 

posted @ 2014-04-06 01:03  Jerry Tong  阅读(231)  评论(0编辑  收藏  举报