7 显示变量值(harib02g)
现在可以显示字符串了,那么这一节我们就来显示变量的值。能不能显示变量值,对于操作系统的开发影响很大。这是因为程序运行与想象中不一致时,将可疑变量的值显示出来是最好的方法。
习惯了在Windows中开发程序的人,如果想看到变量的值,用调试器(debugger)很容易就能看到,但是在开发操作系统过程中可就没那么容易了。就像用Windows的调试器不能对Linux的程序进行调试一样,Windows的调试器也不能对我们的“纸娃娃操作系统”的程序进行调试,更不要说对操作系统本身进行调试了。如果在“纸娃娃操作系统”中也要使用调试器的话,那只有自己做一个调试器了(也可以移植)。在做出调试器之前,只能通过显示变量值来查看确认问题的地方。
闲话就说这么多,让我们回到正题。那怎么样显示变量的值呢?可以使用sprintf函数。它是printf函数的同类,与printf函数的功能很相近。在开始的时候,我们曾提到过,自制操作系统中不能随便使用printf函数,但sprintf可以使用。因为sprintf不是按指定格式输出,只是将输出内容作为字符串写在内存中。
这个sprintf函数,是本次使用的名为GO的C编译器附带的函数。它在制作者的精心设计之下能够不使用操作系统的任何功能。或许有人会认为,什么呀,那样的话,怎么不做个printf函数呢?这是因为输出字符串的方法,各种操作系统都不一样,不管如何精心设计,都不可避免地要使用操作系统的功能。而sprintf不同,它只对内存进行操作,所以可以应用于所有操作系统。
■■■■■
我们这就来试试这个函数吧。要在C语言中使用sprintf函数,就必须在源程序的开头写上#include <stdio.h>,我们也写上这句话。这样以后就可以随便使用sprintf函数了。接下来在HariMain中使用sprintf函数。
sprintf(s, "scrnx = %d", binfo->scrnx); putfonts8_asc(binfo->vram, binfo->scrnx, 16, 64, COL8_FFFFFF, s);
sprintf函数的使用方法是:sprintf(地址,格式,值,值,值,……)。这里的地址指定所生成字符串的存放地址。格式基本上只是单纯的字符串,如果有%d这类记号,就置换成后面的值的内容。除了%d,还有%s, %x等符号,它们用于指定数值以什么方式变换为字符串。%d将数值作为十进制数转化为字符串,%x将数值作为十六进制数转化为字符串。
关于格式的详细说明
我们来运行一下看看。……运行正常。
说点题外话。因为这本书是在笔者吭哧吭哧写完之后大家才看到的,所以虽然讲到“能显示变量的值了”,“以后调试就容易了”,恐怕大家也很难体会到其中的艰辛。但是,笔者是真刀真枪地编程,在此过程中犯了很多的错(大多都是低级错误)。以前,因为不能显示变量的值,所以发现运行异常的时候,只能拼命读代码,想象变量的值来修改程序,非常辛苦。但从今以后可以显示变量的值就轻松多了。
话说,在分辨率是320×200的屏幕上,8×16的字体可是很大哟(笑)。