一、本章准备工具
- FloppyWriter.exe 软盘绝对扇区读写工具,各大下载网站能下载到
- nasm :www.nasm.us/pub/nasm/releasebuilds/2.15.04rc5/win64/nasm-2.15.04rc5-win64.zip
- 一个1.44M的磁盘镜像 从网上下载一个 TINIX.IMG
- Virtual Box虚拟机
- DOS Box
- vscode安装HexDump插件
一、8086的内存分布
8086 地址位长度是20,1M的寻址空间。这1M的空间是按如下进行分配的:
高于 1M的是高位内存区和扩展内存。80386,80486,奔腾等最高寻址4G空间。
二、8086的启动流程
- 计算机上电后,CPU跳到0xFFFF0位置
- 跳转F000:E05B运行BIOS
- BIOS 运行完,最后一步检查0盘0道1扇区,如果这个扇区最后两字节是0x55,0xaa,bios就把这个扇区的内容加载到0x7c00,使用语句 jmp 0:7c00。
- 系统进入 MBR,即运行0x7c00处程序。
下面就写一段程序加载到7c00,让计算机来引导看是否能启动。
三、编译引导程序
org 07c00h ; 告诉编译器程序加载到7c00处mov ax, csmov ds, axmov es, axcall DispStr ; 调用显示字符串例程jmp $ ; 无限循环,$代表当前汇编行的地址DispStr:mov ax, BootMessage ; 把BootMessage的首地址传给寄存器axmov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串长度mov ax, 01301h ; AH = 13, AL = 01hmov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)mov dl, 0int 10h ; 10h 号中断retBootMessage: db "Hello, MY OS!" ; 想要开机后在屏幕上显示的字符串times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节 $$表示一个section的开始处汇编后地址dw 0xaa55 ; 结束标志
把代码保存到nasm的目录,编译:
nasm boot.asm -o boot.bin
四、制作虚拟软盘
1. 把 TINIX.IMG 也放到nasm目录 ,改名 MYOS.IMG
2. 打开FloppyWrite.exe
选择Write File to Image
提示选择文件先选择Boot.bin,第二次弹窗选择MYOS.IMG
五、建立一个虚拟机
1. 随便新建一个虚拟机
2. 添加软盘控制器
添加后的效果:
3. 启动虚拟机
要退出的话需要强制退出。
六、调试引导程序的方法
修改上面代码,把org 07c00h改成 org 0100h , 就可以编译成一个.com文件在DosBox下运行。
为便于以后的调试,下面使用nasm的预编译宏切换org语句加载的地址:
;%define _BOOT_DEBUG_ ; 做Boot Sector时把这行注释掉; 启用这行就用nasm Boot.asm -o Boot.com生成.com文件用于调试%ifdef _BOOT_DEBUG_ org 0100h%else org 07c00h%endifmov ax, csmov ds, axmov es, axcall DispStr ; 调用显示字符串例程jmp $ ; 无限循环DispStr:mov ax, BootMessagemov bp, ax ; ES:BP = 串地址mov cx, 16 ; CX = 串长度mov ax, 01301h ; AH = 13, AL = 01hmov bx, 000ch ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)mov dl, 0int 10h ; 10h 号中断retBootMessage: db "Hello, MY OS!" ; 想要开机后在屏幕上显示的字符串times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节dw 0xaa55 ; 结束标志
七、使用vscode查看镜像内容
VsCode安装 HexDump插件后,在要查看的文件点击键,选择ShowHexdump就可以来查看磁盘镜像的内容:
这里可以看到前512字节就是自己写的汇编程序,以55AA结束。
本文学习资源来自《自己动手写操作系统》于渊 电子工业出版社。