操作系统学习setup_软盘加载

一、目标:从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

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值