|
我在DOS下做了一个比较大的工程,用watcomc 11.0编译的,程序现在运行不了一分钟就死掉,而且死的很彻底,键盘不在相应。
为了调试main()函数只调用了其中一个写屏幕函数,死循环执行,很快程序就会死掉。
在加点东西以后,程序确可以正常运行。同时声明一下,没有用中断,除写显存以外,没有对指针进行操作。
代码如下:
unsigned char *vid_mem = (unsigned char *)0xb8000U;
SDWORD main(void)
{
SBYTE x = 0;
while (1)
{
write_char(24, 0, x++, 0x3e);
MenuTask_S(); /*屏幕打印和键盘 CTRL + q/Q (system exit)*/
}
return 0;
}
void write_char(x,y,ch,attr)
unsigned char x,y,ch,attr;
{
unsigned char *v=0;
unsigned char p1[17],i=0;
if (x > 24)
{
x =0;
}
if (y > 79)
{
y =0;
}
for(i=0;i<17;i++)
{
p1=(SBYTE)'\0';
}
_itoa(ch,p1,16);
v=vid_mem+(x*160)+y*2;
for(i=0;i<2;i++)
{
*v++=p1;
*v++=attr;
}
}
void write_string(x,y,p,attrib)
unsigned char x,y,*p,attrib;
{
unsigned short i;
unsigned char *v=0;
if (x > 24)
{
x =0;
}
if (y > 79)
{
y =0;
}
v=vid_mem+(x*160)+y*2;
for(i=y;*p!='\0';i++)
{
*v++=*p++;
*v++=attrib;
}
}
void DisplaySysDebugInfo(void)
{
static SBYTE init=FALSE_S,colour=0;
SBYTE row=0,col=75;
SWORD i=0,j=0,k=0;
write_string(24,20,"Sys88888888888888888888888b",/*0x20|*/colour++);
}
/*系统屏幕显示任务,每个运算周期调用一次*/
void MenuTask_S(void)
{
DisplaySysDebugInfo();
}
除了以上代码外,还有其它一些文件参与编译,编译的文件不一样,效果也不同。
|