首页 | 程式人生 | 原创下载 | 技术文档 | 留言我们 | 关于我们 |
也说说TURBO C 的秘密
作者:
phanrider
2003-11-05
都什么时代了,还有人来谈这个老掉牙的编译器?!BC,VC,都出来好几年了,还有GCC,g++在LINUX上大行其道。之所以想说说TURBO C 是因为小弟想,在一些学校也许还会有人用TURBO C 2.0 设计毕业论文,也有的人一直用它习惯之缘故,也或许有人在网上很难找到老东西的缘故。所以嘛,小弟又厚着脸皮大言不惭说上几句了。 1. 生成 .COM文件 可以在命令行模式下用: tcc -mt -lt filename 或者可以用: tlink/t filename.obj 2. 延时函数 delay()延时并不精确 该函数只是用简单的循环来实现,这样就造成了在您的机子上运行得很好的一个程式,也许到了别人的机器上就什么也不是了。所以最好自己写个精确度高一点的延时函数,什么是在所有的机器上是不可以改变的呢? --时种频率,对。就是它! 3. 随机函数 random(int num)伪随机 对保密感兴趣的朋友经常会用到随机函数,可是随机函数真的是离散性的给出随机数吗?不会,它会在一定的条件下,出现相同的数据。 4. 虚拟变量要小心 如果我们要撰写常驻程式,哪您就必需要小心虚拟变量,现在我们来看个例子: geninterrupt()这个函数大概要算一个了,从严格意义上说,它并不能算是"函数",而应算作"宏",观察TURBO C 的头文件"DOS.H" 其中有一行 #define geninterrupt(i) _int_(i) 的定义,会使其以宏的方式转译。例如: geninterrupt(0x13); 将会被转换为 int 19 要注意的是,转换后的值为十进制,要使其成为“宏”来转换有两个条件,一是要有包含“#include ”的说明,另一个就是“i”不可为变量,否则会造成不同的转译。 一个读A盘0道0面的扇区之数据 #include char buffer[512]; main() { _AX=0x0201; _BX=FP_OFF(buffer); _CX=0x0000; _DX=0x0000; _ES=FP_SEG(buffer); /* 一个BUG */ geninterrupt(0x13); if(_FLAGS&1) printf("error!"); } 上面的方法是很直接,设置好各个寄存器,然后产生INT 13中断,再由虚拟变量_FLAGS与此1作“与运算”来断是否出错。但是有一个很严重的BUG,我们把它转换成ASM文件时,将会发现,在给定_ES之值时,它会破坏AX及BX寄存器的值。正确做法是把" _ES=FP_SEG(buffer);"这一句调到"_AX=0x0201;"之前。 5. 如何将图形驱动文件加入graphics.lib中 加入EGA_VGA图形驱动文件: bgiobj egavga /* 如果加参数 /F 则是远程调用 */ tlib graphics.lib+egavga.obj 加入字体文件: bgiobj goth tlib graphics.lib+goth.obj 这样就可以让我们的程式到哪儿都能运行而不用再带上各种 .bgi 和 .chr 文件了。
还有很多东西呢,只是小弟也是才巯学浅,略知一二,希望对您能有所帮助。 如有错误敬请来信指教,以免有误人子弟之嫌。 如转载本内容请保留此文档的完整. |
![]()
|