4 用C语言显示字符串(1)(harib19d)
我们已经做好了用来显示字符串的API,却没做可供C语言调用该API的函数。不过这个很容易,我们现在就来做做看。
本次的a_nask.nas节选
_api_putstr0: ; void api_putstr0(char *s);
PUSH EBX
MOV EDX,2
MOV EBX,[ESP+8] ; s
INT 0x40
POP EBX
RET
利用上面的函数我们来写一个hello4.hrb。
本次的hello4.c
void api_putstr0(char *s);
void api_end(void);
void HariMain(void)
{
api_putstr0("hello, world\n");
api_end();
}
好,我们来“make run”……咦?什么都没显示出来,太奇怪了。
什么都没出来!
运行没成功感觉很不爽,不过在读程序排查原因思考对策的时候,想到了一件与此无关的事:既然已经不能用RETF指令来结束程序了,那么“Hari”那时候对开头6个字节的改写也用不到了吧。
去掉6个字节的改写之后,程序就不再JMP到0x1b了,因此start_app的地址也需要修改一下。
本次的console.c节选
int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
{
(中略)
if (finfo != 0) {
/*找到文件的情况*/
(中略)
if (finfo->size >= 8 && strncmp(p + 4, "Hari", 4) == 0) {
start_app(0x1b, 1003 * 8, 64 * 1024, 1004 * 8, &(task->tss.esp0));
} else {
start_app(0, 1003 * 8, 64 * 1024, 1004 * 8, &(task->tss.esp0));
}
(中略)
}
(中略)
}
这样改过以后,hello3.hrb还能不能正常运行呢?我们来“make run”试验一下。哦哦,不错不错,运行正常,太完美了……不过hello4.hrb还是不行呢。