首页 | 程式人生 | 原创下载 | 技术文档 | 留言我们 | 关于我们

也说说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 文件了。

 

还有很多东西呢,只是小弟也是才巯学浅,略知一二,希望对您能有所帮助。

如有错误敬请来信指教,以免有误人子弟之嫌。

如转载本内容请保留此文档的完整.


→返回←

红蜻蜓工作室版权所有
Copyright © 1999-2025 Reddragonfly & Studio All Rights Reserved.
如有任何问题及建议请留言红蜻蜓工作室