硬盘扇区号从1开始(不是从0开始)
程序 | 起始扇区号 | 程序大小(扇区数) |
---|---|---|
bootsec.asm | 1 | 1 |
loader.asm | 2 | 15 |
kernel.bin | 20 | 15 |
nasm bootsec.asm -o bootsec.com
nasm loader.asm -o loader.com
nasm kernel.asm -o kernel.com
dd if=bootsec.com of=/dev/sda
dd if=loader.com of=/dev/sda bs=512 count=15 seek=1
dd if=kernel.com of=/dev/sda bs=512 count=15 seek=19
代码
bootsec.asm
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
BaseOfLoader equ 09000h ; LOADER.BIN 被加载到的位置 ---- 段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被加载到的位置 ---- 偏移地址
BeginSectorOfLoader equ 2 ; loader起始扇区放在2位置
SectorNumsOfLoader equ 15 ; loader占用扇区数
BaseOfKernelFile equ 08000h ; KERNEL.BIN 被加载到的位置 ---- 段地址
OffsetOfKernelFile equ 0h ; KERNEL.BIN 被加载到的位置 ---- 偏移地址
BeginSectorOfKernelFile equ 20 ; KernelFile起始扇区放在2位置
SectorNumsOfKernelFile equ 15 ; KernelFile占用扇区数
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
; 符号定义结束
org 7c00h
mov ax, cs
mov ds, ax
mov es, ax
mov dh,0
mov dl,0
call SetLn
mov ax, BootMsg1
mov cx, 18
call DspStr
mov dh,1
mov dl,0
call SetLn
mov ax, BootMsg2
mov cx, 18
call DspStr
push es
push bx
;加载loader
mov ax, BaseOfLoader
mov es, ax
mov bx, OffsetOfLoader
mov ah, 02h
mov al, SectorNumsOfLoader
mov ch, 00h
mov cl, BeginSectorOfLoader
mov dh, 00h
mov dl, 80h
int 13h
;加载内核
mov ax, BaseOfKernelFile
mov es, ax
mov bx, OffsetOfKernelFile
mov ah, 02h
mov al, SectorNumsOfKernelFile
mov ch, 00h
mov cl, BeginSectorOfKernelFile
mov dh, 00h
mov dl, 80h
int 13h
pop bx
pop es
;跳转到loader
jmp BaseOfLoader:OffsetOfLoader
SetLn:
mov ah,2
mov bh,0
;mov dh,光标行号
;mov dl,光标列号
int 10h
ret
DspStr:
mov bp, ax
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMsg1: db "[boot] load loader"
BootMsg2: db "[boot] load kernel"
times 510 - ($ - $$) db 0
dw 0xaa55
loader.asm
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
BaseOfLoader equ 09000h ; LOADER.BIN 被加载到的位置 ---- 段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被加载到的位置 ---- 偏移地址
BeginSectorOfLoader equ 2 ; loader起始扇区放在2位置
SectorNumsOfLoader equ 15 ; loader占用扇区数
BaseOfKernelFile equ 08000h ; KERNEL.BIN 被加载到的位置 ---- 段地址
OffsetOfKernelFile equ 0h ; KERNEL.BIN 被加载到的位置 ---- 偏移地址
BeginSectorOfKernelFile equ 20 ; KernelFile起始扇区放在2位置
SectorNumsOfKernelFile equ 15 ; KernelFile占用扇区数
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
; 符号定义结束
org 0100h
mov ax, cs
mov ds, ax
mov es, ax
mov dh,2
mov dl,0
call SetLn
mov ax, LoaderMsg
mov cx, 16
call DspStr
;跳转到kernel
jmp BaseOfKernelFile:OffsetOfKernelFile
SetLn:
mov ah,2
mov bh,0
;mov dh,光标行号
;mov dl,光标列号
int 10h
ret
DspStr:
mov bp, ax
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
LoaderMsg: db "[loader] dsp str"
kernel.asm
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
BaseOfLoader equ 09000h ; LOADER.BIN 被加载到的位置 ---- 段地址
OffsetOfLoader equ 0100h ; LOADER.BIN 被加载到的位置 ---- 偏移地址
BeginSectorOfLoader equ 2 ; loader起始扇区放在2位置
SectorNumsOfLoader equ 15 ; loader占用扇区数
BaseOfKernelFile equ 08000h ; KERNEL.BIN 被加载到的位置 ---- 段地址
OffsetOfKernelFile equ 0h ; KERNEL.BIN 被加载到的位置 ---- 偏移地址
BeginSectorOfKernelFile equ 20 ; KernelFile起始扇区放在2位置
SectorNumsOfKernelFile equ 15 ; KernelFile占用扇区数
; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
; 符号定义结束
org 0h
mov ax, cs
mov ds, ax
mov es, ax
mov dh,3
mov dl,0
call SetLn
mov ax, KernelMsg
mov cx, 16
call DspStr
;死循环
jmp $
SetLn:
mov ah,2
mov bh,0
;mov dh,光标行号
;mov dl,光标列号
int 10h
ret
DspStr:
mov bp, ax
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
KernelMsg: db "[kernel] dsp str"
网友评论