工具介绍
nasm是一个汇编编译工具,它是开源的,且使用比较广泛,具体关于nasm的介绍可以看《nasmdoc.pdf》,在安装nasm后可以在安装目录下找到该pdf文件。
bochs是一个开源的模拟器,这里主要用来运行通过nasm编译出来的二进制。
还需要介绍一个工具vim,它是linux下广泛使用的编辑器,这里使用了它的windows版本。
使用流程
使用vim写一个简单的程序,代码如下:
mov ax, 0xb800 ;表示的是显存起始位置(后面还会提到)
mov ds, ax
mov byte [0x00], 'H' ;打印 Hello World!
mov byte [0x01],0x07
mov byte [0x02], 'e'
mov byte [0x01],0x07
mov byte [0x04], 'l'
mov byte [0x01],0x07
mov byte [0x06], 'l'
mov byte [0x01],0x07
mov byte [0x08], 'o'
mov byte [0x01],0x07
mov byte [0x0C], 'w'
mov byte [0x01],0x07
mov byte [0x0E], 'o'
mov byte [0x01],0x07
mov byte [0x10], 'r'
mov byte [0x01],0x07
mov byte [0x12], 'l'
mov byte [0x01],0x07
mov byte [0x14], 'd'
mov byte [0x01],0x07
mov byte [0x16], '!'
mov byte [0x01],0x07
jmp $ ;让 CPU 挂这里
times 393 db 0
db 0x55, 0xaa ;虚拟机需要检测 MBR 标记
然后通过nasm编译,编译命令如下:
编译得到的img文件将用于bochs中。
启动bochsdbg工具:
设置Disk&Boot这一项:
设置完成后保存,运行Start启动模拟,之后会有两个界面:
一个是前台的显示:
一个是后台的调试:
bochs启动后会停留在0xfffffff0的位置,即运行BIOS前。这里的BIOS可以在bochs的安装目录中找到:
打开bios.bin可以看到对应的代码:
之后通过s命令可以单步执行BIOS:
由于当BIOS执行完成后,会跳转到0x7c00的位置,而该位置的数据是BIOS从硬盘中读取的,这里就是我们的 Helloworld.img文件。通过b 0x7c00,可以在该位置打上断点,然后通过c命令执行运行到断点处:
这一句指令刚好跟我们的Helloworld.img二进制中的指令一致:
也与我们写的代码一致:
mov ax, 0xb800