4 用C语言显示字符串(1)(harib19d)

我们已经做好了用来显示字符串的API,却没做可供C语言调用该API的函数。不过这个很容易,我们现在就来做做看。

本次的a_nask.nas节选

  1. _api_putstr0: ; void api_putstr0(char *s);
  2. PUSH EBX
  3. MOV EDX,2
  4. MOV EBX,[ESP+8] ; s
  5. INT 0x40
  6. POP EBX
  7. RET

利用上面的函数我们来写一个hello4.hrb。

本次的hello4.c

  1. void api_putstr0(char *s);
  2. void api_end(void);
  3. void HariMain(void)
  4. {
  5. api_putstr0("hello, world\n");
  6. api_end();
  7. }

好,我们来“make run”……咦?什么都没显示出来,太奇怪了。

4 用C语言显示字符串(1)(harib19d) - 图1

什么都没出来!

运行没成功感觉很不爽,不过在读程序排查原因思考对策的时候,想到了一件与此无关的事:既然已经不能用RETF指令来结束程序了,那么“Hari”那时候对开头6个字节的改写也用不到了吧。

去掉6个字节的改写之后,程序就不再JMP到0x1b了,因此start_app的地址也需要修改一下。

本次的console.c节选

  1. int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
  2. {
  3. (中略)
  4. if (finfo != 0) {
  5. /*找到文件的情况*/
  6. (中略)
  7. if (finfo->size >= 8 && strncmp(p + 4, "Hari", 4) == 0) {
  8. start_app(0x1b, 1003 * 8, 64 * 1024, 1004 * 8, &(task->tss.esp0));
  9. } else {
  10. start_app(0, 1003 * 8, 64 * 1024, 1004 * 8, &(task->tss.esp0));
  11. }
  12. (中略)
  13. }
  14. (中略)
  15. }

这样改过以后,hello3.hrb还能不能正常运行呢?我们来“make run”试验一下。哦哦,不错不错,运行正常,太完美了……不过hello4.hrb还是不行呢。