一、目标:从boot加载setup到内存
1、把setup程序写好,想办法放到软盘的第二个扇区;
2、调用BIOS int 0x13中断例程把软盘上的程序读取到内存0x500地址处;
3、跳转到0x500处执行。
二、准备框架并写程序
1、准备Makefile
build:
nasm boot.asm
nasm setup.asm
dd of=/dev/zero of=a.img bs=512 count=2880
dd of=boot of=a.img bs=512 count=1 seek=0 conv=notrunc
dd of=setup of=a.img bs=512 count=1 seek=1 conv=notrunc
# seek:从第几个扇区开始的意思。这里0代表的是第一个扇区!注意这和后面int 0x13程序参数1代表第一个
# 扇区不同!conv:转换成img文件处理方式,notrunc表示不截断。
bochs:
bochs -q -f bochsrc
clean:
rm boot setup a.img
2、生成bochsrc配置文件
运行bochs,选择4,输入文件名bochsrc,改3个地方。(bochs2.7)
display_library: x, options="gui_debug" # 用图形界面的debug工具,否则是命令行方式
boot: floppy
floppya: type=1_44M, image="a.img", status=inserted
magic_break: enabled=1 #启用魔术断点xchg bx,bx
3、编写boot.asm
[org 0x7c00]
[section .data]
SETUP_LOAD_ADDR equ 0x500 ; 多次用到的常量建议起一个别名,修改的时候不用逐个去找
[section .text]
[bits 16]
global _start:
_start:
mov ax, 0
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov sp, 0x1000
mov ax, 3
int 0x10
mov si, tip_msg
call print
call read_disk
jmp SETUP_LOAD_ADDR
read_disk:
mov dh, 0 ; 磁头号
mov dl, 0 ; 驱动器号
mov ch, 0 ; 柱面号
mov cl, 2 ; 第几个扇区开始
mov bx, SETUP_LOAD_ADDR ; 读出的数据放在内存的位置
mov ah, 2 ; 功能号,2表示是读磁盘
mov al, 1 ; 读几个扇区
int 0x13
pushf ; 标志寄存器压栈
pop di ; 标志寄存器的值传给di
and 0x01 ; 测试最低位(cf)的值,值为0,表示没有出错
cmp di, 0
jz .done
jmp read_disk
.done
ret
print:
mov ah, 0x0e
mov bh, 0
mov bl, 1
.loop:
mov al, [si]
cmp al, 0
jz .done
int 0x10
inc si
jmp .loop
.done:
ret
tip_msg:
db "Load setup routine ...", 10, 13, 0
读磁盘的参数比较多,但是也是有规律的,估计设计这个程序的神也考虑到了。(这样记忆自己感觉还不错。dh存磁头号:disk head;dl存驱动器编号:disk label;ch存柱面号:cycle hao;cl存从第几个扇区开始读,整个cx的意思就是从哪个柱面的第几扇区读;bx写道内存的哪个地址:base xxxx;ah存功能号,al存一共读几个扇区,整个ax的意思就是读多少个扇区。)如果读磁盘出错,会将cf位置1。 磁盘操作参数把dx、cx、bx、ax四个通用寄存器都用上了。
4、编写setup.asm
[org 0x500]
[section .text]
[bits 16]
mov si, wel_msg
call print
jmp $
print:
mov ax, 0xb800 ;显存映射地址,16bit表示一个字符,高8bit指定色背景,低8bit指定字符
mov gs, ax
mov di, 0xA0 ;一行80个字符占160个字节。本行代码相当于换行
mov ah, 0x71 ;颜色和背景。自己随便设置的。具体数值代表什么可以网上查
.loop:
mov al, [si]
cmp al, 0
jz .done
mov word[gs:di], al
inc si
inc di
inc di
jmp .loop
.done:
ret
wel_msg:
"Welcome setup come here.", 0