3 显示单个字符的API(2)(harib17c)*
像这样会造成模拟器出错关闭的bug,果然只有在开发操作系统时才能碰到。如果不用模拟器进行开发的话,不经意间产生的bug有时可能会造成电脑损坏、硬盘被格式化等严重问题,也许好几天都无法恢复过来。开发操作系统就是这么刺激。如果通过这次的bug,大家能够瞥见这种刺激的冰山一角,那么笔者觉得这个bug也算是有点用的吧(苦笑)。
不过,光扯刺激啦什么的也无济于事,我们还得仔细寻找原因。哦,原来如此,找到了!
原因其实很简单。应用程序对API执行CALL的时候,千万不能忘记加上段号。应用程序所在的段为“1003 8”,而操作系统所在的段为“2 8”,因此我们不能使用普通的CALL,而应该使用far-CALL。
far-CALL实际上和far-JMP一样,只要同时指定段和偏移量即可。
本次的hlt.nas
[BITS 32]
MOV AL,'A'
CALL 2*8:0xbe3
fin:
HLT
JMP fin
好,完工了,这样bug应该就解决了,我们来试试看。“make run”,然后运行“hlt”。咦?还是不行。这次虽然没有出错关闭,但qemu.exe停止响应了。
这个问题是由于_asm_cons_putchar的RET指令所造成的。普通的RET指令是用于普通的CALL的返回,而不能用于far-CALL的返回,既然我们用了far-CALL,就必须相应地使用far-RET,也就是RETF指令。因此我们将程序修改一下。
_asm_cons_putchar:
(中略)
RETF ; 这里!
好啦,这次应该没问题了吧。“make run”,“hlt”,成功了!撒花!
字符显示出来了哦!!!