编写主引导扇区程序

test.asm

1
2
3
4
5
6
7
8
mov ax, 0x30
mov dx, 0xC0
add ax, dx

times 502 db 0

db 0x55
db 0xAA

一个扇区有512个字节,前面一共是8个字节,后面有2个字节,中间就只需要填充502个字节了

对源程序进行编译:nasm -f bin test.asm -o test.bin

test.bin的二进制如下:
一个有效的主引导扇区程序,其最后的两个字节数据必须是0x55, 0xAA(规定的)

image-20210522002248908

创建虚拟硬盘并向虚拟硬盘中写入主引导扇区程序

创建虚拟硬盘

image-20210522002322591

image-20210522002334852

查看刚刚创建的虚拟硬盘

image-20210522002408926

把之前编译的bin文件写入到虚拟硬盘中

image-20210522002420227

image-20210522002433268

打开bochs,调好参数

image-20210522002443901

image-20210522002449835

image-20210522002455062

调试主引导扇区程序

start后,左边是虚拟机调试窗口,右边是虚拟机的显示器

image-20210522002509425

Next at t=0
[0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0
t表示当前的内部时钟是0,下一条指令在此基础上执行然后依次是物理地址、逻辑地址、汇编指令、机器码
仔细看会发现,物理地址和逻辑地址是不一致的,这个原因以后再解释,只会出现在刚加电的时候

sreg查看段寄存器内容

image-20210522002522235

r显示通用寄存器

image-20210522002532187

s单步执行
b设置断点
c执行到断点

image-20210522002541899

执行完后发现右边的显卡已经初始化了,下一步执行 mov ax, 0x0030是我们之前写的程序的第一条命令

image-20210522002550957

继续往下发现都符合,主引扇区写入成功

image-20210522002602679