上一节我们根据内存地址推算,确定0xc400位置保存着我们存储在软盘中的sys.bin内容,并跳转到这个地址位置开始执行。但我们如何确认代码正确执行了呢?

hlt指令

CPU负载

当前在sys.bin中只有一个死循环,如果程序中出现一个死循环,那会将所有空闲CPU资源占满,即运行死循环的CPU负载会飙到100%。在真实机器上这点可能不好确认,但如果在虚拟机中运行操作系统,我们可以很容易的在宿主机上观察到这点。

loop 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

使用b0xc400处设置断点,运行后断点命中:

bochs b

命中断点后,使用反编译指令u反编译0xc400开始的2行代码,可以看到,与我们写的内容基本一致。

bochs u

跳转指令不完全一致,但可以猜到是给予当前行$-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'

print sys

可以看到,sys.asm中的打印代码成功输出了,因此可以确认sys.asm已经被正确执行了。