02-操作系统接力第一棒之MBR程序示例

MBR(Master Boot Record)是计算机启动过程中的一个重要组成部分,它存在于存储设备的第一个扇区中,并负责引导操作系统的加载。下面是一个简单的MBR程序示例:

;mbr.s
org 0x7C00      ; 指定程序的起始内存地址为0x7C00

jmp 0x0000:start   ; 无条件跳转到start标签

; 引导程序的代码部分开始
start:
    mov ax, cs       ; 把当前代码段的值赋给寄存器AX
    mov ds, ax       ; 把DS寄存器的值设为AX的值,即把DS寄存器与当前代码段相关联
    
    mov si, msg      ; 把消息的地址赋给寄存器SI
    
    mov ah, 0x0E     ; 设置显示的功能为0x0E,即在屏幕上显示字符
    mov bh, 0x00     ; 设置显示的页面为0x00,即在当前页面上显示
    mov bl, 0x07     ; 设置字符的颜色为0x07,即白色
    
print_loop:
    lodsb            ; 从SI指定的地址读取一个字节到寄存器AL,并且SI加一
    cmp al, 0        ; 比较AL寄存器的值是否为0
    je $ + 3         ; 如果AL等于0,则程序跳转到下面的代码,结束循环
    int 0x10         ; 调用BIOS的0x10中断,显示AL寄存器的内容
    jmp print_loop   ; 无条件跳转回到print_loop标签
    

; 数据段定义
msg db 'Hello, World!',0   ; 存储要显示的消息

times 510-($-$$) db 0    ; 填充剩余的空间,使程序的大小为512字节
dw 0xAA55              ; MBR的结束标识

上述代码是一个简单的MBR程序,它会在屏幕上显示一个"Hello, World!"的消息。在程序开始的部分,通过jmp指令跳转到start标签,然后将相关的寄存器初始化。接下来,利用lodsb指令从消息的地址逐个读取字符,并通过int 0x10中断调用来显示在屏幕上。循环直到遇到0为止,然后程序结束。最后,使用times指令填充剩余的空间,使程序大小达到512字节,并添加MBR的结束标识。

请注意,MBR程序是直接在物理存储设备上运行的,因此编写MBR程序时需要非常小心,以免造成数据丢失或系统崩溃。在实际使用时,请确保充分了解MBR的工作原理,并且谨慎地测试和部署程序。

#编译
nasm -o mbr.bin mbr.s

#制作虚拟硬盘
bximage -hd -mode="flat" -size=60 -q hd.img

#把mbr.bin写入到虚拟硬盘中
dd if=mbr.bin of=hd.img bs=512 count=1 conv=notrunc

 下面为bochs启动配置文件

###############################################
# Configuration file for Bochs
###############################################1.5 运行 bochs
#第一步,首先设置 Bochs 在运行过程中能够使用的内存,本例为 32MB。
#关键字为 megs
megs: 32
#第二步,设置对应真实机器的 BIOS 和 VGA BIOS 。
#对应两个关键字为 : romimage 和 vgaromimage
romimage: file=/usr/share/bochs/share/bochs//BIOS-bochs-latest
vgaromimage: file=/usr/share/bochs/share/bochs//VGABIOS-lgpl-latest
#vgaromimage: file=/usr/share/vgabios/vgabios.bin
#第三步,设置 Bochs 所使用的磁盘,软盘的关键字为 floppy。
#若只有一个软盘,目IJ使用 floppya 即可,若有多个,则为 floppya, floppyb…
#floppya: 1_44=a.img, status=inserted
#floppya: 1_44=/root/bd60M.img, status=inserted
#第四步,选择启动盘符。
#boot: floppy #默认从软盘启动,将其注释
#改为从硬盘启动。我们的任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作。
boot: disk 
#第五步,设置日志文件的输出。
log: bochs.out
#第六步,开启或关闭某些功能。
#下面是关闭鼠标,并打开键盘。
mouse: enabled=0
keyboard_mapping: enabled=l,map=/usr/share/bochs/share/bochs/keymaps/xll-pc-us.map
#硬盘设置
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#ata0-master: type=disk, path="/root/hd60M.img", mode=flat, cylinders=121, heads=16, spt=63
ata0-master: type=disk, path="hd.img", cylinders=306, heads=4, spt=17
#下面的是增加的 bochs 对 gdb 的支持,这样 gdb 便可以远程连接到此机器的 1 234 端口调试了
#gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

运行 :

#运行
bochs -f bochrc

最终结果如下: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值