主引导(MBR)程序
建立 mbr.S 主引导汇编程序:引导成功后将会输出:My MBR
;主引导程序 SECTION MBR vstart=0x7c00 ;程序开始的地址 mov ax,cs ;使用cs初始化其他的寄存器 mov ds,ax ;因为是通过jmp 0:0x7c00到的MBR开始地址 mov es,ax ;所以此时的cs为0,也就是用0初始化其他寄存器 mov ss,ax ;此类的寄存器不同通过立即数赋值,采用ax中转 mov fs,ax mov sp,0x7c00 ;初始化栈指针 ;清屏利用0x10中断的0x6号功能 mov ax,0x600 mov bx,0x700 mov cx,0 mov dx,0x184f int 0x10 ;获取光标位置 mov ah,3 ;3号子功能获取光标位置 mov bh,1 ;bh寄存器存储带获取光标位置的页号,从0开始,此处填1可以看成将光电脑标移动到最开始 int 0x10 ;打印字符串 mov ax,message mov bp,ax mov cx,6 ;字符串长度,不包括'\0' mov ax,0x1301 mov bx,0x2 int 0x10 jmp $ message db "My MBR" times 510-($-$$) db 0 db 0x55,0xaa
将mbr.S 主引导汇编程序放到bochs的主目录下,通过NASM编译汇编代码,前面已经介绍过nasm和bochs的安装。
编译执行: nasm -o mbr.bin mbr.S
进入bochs目录,执行bximge
输入1 回车, 去建立硬盘镜像
根据提示进行输入,硬盘的镜像文件名为:hd60M.img,如上图
在bochs的主目录下, 修改bochsrc文件修改为:ata0-master: type=disk, path="hd60M.img", mode=flat
启动项为 disk, 如下图
下一步是把这个512字节的文件写入0盘0道0扇区执行:
dd if=mbr.bin of=/usr/local/bin/hd60M.img bs=512 count=1 conv=notrunc
模拟硬盘启动1.执行 bochs -f bochsrc 弹出Bochs x86-64 emulator窗口,但是窗口一片黑
2.切换回终端界面,可以看到已经选择了[6] 开始模拟,输入c 回车
弹出如下界面:
bachs x86-64模拟器 输出My MBR
说明已成功从我们自己制作的硬盘镜像完成主引导启动。
选择Continue继续出现下图 Boot failed: not a bootable disk
说明mbr.S主引导程序有问题。可以查看编译后的二进制文件mbr.bin的尺寸大小
如果超过512字节, 说明mbr.S源文件有问题,我的开始是mbr.S源文件中指令参数之间有多余的空格,删除后重新编译 nasm -o mbr.bin mbr.S
编译后查看mbr.bin文件大小,为512字节
重新执行dd命令后,就正常了。
dd if=mbr.bin of=/usr/local/bin/hd60M.img bs=512 count=1 conv=notrunc