确认软盘内容执行
上一节我们根据内存地址推算,确定0xc400
位置保存着我们存储在软盘中的sys.bin
内容,并跳转到这个地址位置开始执行。但我们如何确认代码正确执行了呢?
hlt指令
CPU负载
当前在sys.bin
中只有一个死循环,如果程序中出现一个死循环,那会将所有空闲CPU资源占满,即运行死循环的CPU负载会飙到100%。在真实机器上这点可能不好确认,但如果在虚拟机中运行操作系统,我们可以很容易的在宿主机上观察到这点。
hlt指令
当前我们的OS还没有任何实质性业务,就这样空跑CPU比较浪费。hlt
指令就是为了解决这个问题的,它可以使CPU进入暂停状态,不执行任何操作。
我们修改sys.asm
代码如下,在死循环中插入hlt
指令。
org 0xc400
fin:
hlt
jmp fin
再试试效果:
bochs Debug
我们使用bochs虚拟机来运行我们写的OS,bochs提供了很多调试功能,可以看到cpu寄存器,内存等实时的数据。这样可以更直观的看到我们的OS运行情况。
这里我们用到两个调试命令:
- 打断点
b 0xc400
- 反编译内存内容
u /10
使用b
在0xc400
处设置断点,运行后断点命中:
命中断点后,使用反编译指令u
反编译0xc400
开始的2行代码,可以看到,与我们写的内容基本一致。
跳转指令不完全一致,但可以猜到是给予当前行$
-3位置处。
添加打印
我们也可以通过在sys.asm
调用BIOS的打印中断int 10h
来往屏幕写内容,确认代码是否执行成功。
mov ax, 0xb800
mov gs, ax
mov byte [gs:0xa0],'s'
mov byte [gs:0xa2],'y'
mov byte [gs:0xa4],'s'
可以看到,sys.asm
中的打印代码成功输出了,因此可以确认sys.asm
已经被正确执行了。