6 为应用程序自由命名(harib17f)

现在我们的应用程序只能用hlt这个名字,下面我们来让系统支持其他应用程序名,这次我们就用hello吧。将console.c中的“hlt”改成“hello”,好啦,这样我们就可以用hello这个应用程序了……哇!别生气别生气,开个玩笑而已(笑)。

好吧,我们先来改写cons_runcmd。

本次的console.c节选

  1. void cons_runcmd(char *cmdline, struct CONSOLE *cons, int *fat, unsigned int memtotal)
  2. {
  3. if (strcmp(cmdline, "mem") == 0) {
  4. cmd_mem(cons, memtotal);
  5. } else if (strcmp(cmdline, "cls") == 0) {
  6. cmd_cls(cons);
  7. } else if (strcmp(cmdline, "dir") == 0) {
  8. cmd_dir(cons);
  9. } else if (strncmp(cmdline, "type ", 5) == 0) {
  10. cmd_type(cons, fat, cmdline);
  11. } else if (cmdline[0] != 0) { /*从此开始*/
  12. if (cmd_app(cons, fat, cmdline) == 0) {
  13. /*不是命令,不是应用程序,也不是空行*/
  14. putfonts8_asc_sht(cons->sht, 8, cons->cur_y, COL8_FFFFFF, COL8_000000, "Bad command.", 12);
  15. cons_newline(cons);
  16. cons_newline(cons);
  17. }
  18. } /*到此结束 */
  19. return;
  20. }

总结一下修改的地方,首先是去掉了cmd_hlt,并创建了新的cmd_app。这个函数用来根据命令行的内容判断文件名,并运行相应的应用程序,如果找到文件则返回1,没有找到文件则返回0。

现在程序的工作过程是:当输入的命令不是mem、cls、dir、type其中之一时,则调用cmd_app,如果返回0则作为错误处理。这样应该能行。

我们在cmd_hlt的基础上稍作修改后得到cmd_app函数,具体内容如下。

本次的console.c节选

  1. int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
  2. {
  3. struct MEMMAN *memman = (struct MEMMAN *) MEMMAN_ADDR;
  4. struct FILEINFO *finfo;
  5. struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
  6. char name[18], *p;
  7. int i;
  8. /*根据命令行生成文件名*/
  9. for (i = 0; i < 13; i++) {
  10. if (cmdline[i] <= ' ') {
  11. break;
  12. }
  13. name[i] = cmdline[i];
  14. }
  15. name[i] = 0; /*暂且将文件名的后面置为0*/
  16. /*寻找文件 */
  17. finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
  18. if (finfo == 0 && name[i -1]!= '.') {
  19. /*由于找不到文件,故在文件名后面加上“.hrb”后重新寻找*/
  20. name[i ] = '.';
  21. name[i + 1] = 'H';
  22. name[i + 2] = 'R';
  23. name[i + 3] = 'B';
  24. name[i + 4] = 0;
  25. finfo = file_search(name, (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
  26. }
  27. if (finfo != 0) {
  28. /*找到文件的情况*/
  29. p = (char *) memman_alloc_4k(memman, finfo->size);
  30. file_loadfile(finfo->clustno, finfo->size, p, fat, (char *) (ADR_DISKIMG + 0x003e00));
  31. set_segmdesc(gdt + 1003, finfo->size - 1, (int) p, AR_CODE32_ER);
  32. farcall(0, 1003 * 8);
  33. memman_free_4k(memman, (int) p, finfo->size);
  34. cons_newline(cons);
  35. return 1;
  36. }
  37. /*没有找到文件的情况*/
  38. return 0;
  39. }

我们在程序上动了一点脑筋,使得无论输入“hlt”还是“hlt.hrb”都可以启动“hlt.hrb”。因为在Windows命令行窗口中,不管加不加后面的“.exe”都可以运行程序,所以我们就借鉴了这个设计。

■■■■■

差不多完工了,我们将hlt.nas改名为hello.nas,然后汇编生成hello.hrb。接下来“make run”,用dir命令确认一下磁盘中的内容,再输入“hello”。哦!出来了!成功了!

6 为应用程序自由命名(harib17f) - 图1

再来一次,你好!

嗯嗯,不错!我们再来输入“hlt”试一下,这个文件现在已经没有了,会不会报错呢?另外,如果输入“hello.hrb”能否正常运行呢?我们来试试看。

6 为应用程序自由命名(harib17f) - 图2

报错了哦

出现错误信息了,加上扩展名的情况也OK,太完美了。