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
最终结果如下: