3 显示单个字符的API(2)(harib17c)*

像这样会造成模拟器出错关闭的bug,果然只有在开发操作系统时才能碰到。如果不用模拟器进行开发的话,不经意间产生的bug有时可能会造成电脑损坏、硬盘被格式化等严重问题,也许好几天都无法恢复过来。开发操作系统就是这么刺激。如果通过这次的bug,大家能够瞥见这种刺激的冰山一角,那么笔者觉得这个bug也算是有点用的吧(苦笑)。

不过,光扯刺激啦什么的也无济于事,我们还得仔细寻找原因。哦,原来如此,找到了!

原因其实很简单。应用程序对API执行CALL的时候,千万不能忘记加上段号。应用程序所在的段为“1003 8”,而操作系统所在的段为“2 8”,因此我们不能使用普通的CALL,而应该使用far-CALL。

far-CALL实际上和far-JMP一样,只要同时指定段和偏移量即可。

本次的hlt.nas

  1. [BITS 32]
  2. MOV AL,'A'
  3. CALL 2*8:0xbe3
  4. fin:
  5. HLT
  6. JMP fin

好,完工了,这样bug应该就解决了,我们来试试看。“make run”,然后运行“hlt”。咦?还是不行。这次虽然没有出错关闭,但qemu.exe停止响应了。

这个问题是由于_asm_cons_putchar的RET指令所造成的。普通的RET指令是用于普通的CALL的返回,而不能用于far-CALL的返回,既然我们用了far-CALL,就必须相应地使用far-RET,也就是RETF指令。因此我们将程序修改一下。

  1. _asm_cons_putchar:
  2. (中略)
  3. RETF ; 这里!

好啦,这次应该没问题了吧。“make run”,“hlt”,成功了!撒花!

3 显示单个字符的API(2)(harib17c)* - 图1

字符显示出来了哦!!!