导航:首页 > 源码编译 > tc20结果怎么编译

tc20结果怎么编译

发布时间:2022-12-23 20:13:13

① 如何C语言与汇编混编

c语言可以嵌套汇编:
按照TC2.0的帮助系统所以说的,在TC2.0下是可以用汇编的,方法是使用asm关键字:其格式是:
asm opcode <operands> <;newline>,如同别的注释一样,<>之间的表示可选的;例如:

main()
{
char *c="hello,world/n/r$";
asm mov ah,9;asm mov dx,c;asm int 33;
printf("You sucessed!/n");

}
或者是:

main()
{
char *c="hello,world/n/r$";
asm mov ah,9
asm mov dx,c
asm int 33
printf("You sucessed!");
}
两种格式其实是一种.如果你用的是第一种的样式,记住:
每一句汇编语句都要以asm开头,如果一行内有多个句子,
那么千万不要忘记在两个句子之间的这个semicolon(分号),
但是最后一句汇编后面(如果后面没有其它的语句)的分号可有可无,象第一个例子中的
asm int 33;后面的分号就可以不要,因为它的后面没有其它
的语句了.但如果是这样:
asm mov ah,9; asm mov dx,c;asm int 33; printf("You sucessed!");
那么asm int 33;后面的分号便还是留下好,以免出现编译错误!
在这一点上颇象C语言.

还有一种格式是
asm{ assembly language statement},这种格式应该被普遍的欢迎.
它们的例子如下(其中的语句排列格式与上面两种相同):
asm{
mov ax,var1
add ax,var2
......
}
但是要注意这种格式TC2.0是不支持的!
只有后来的TC++3.0及后来的IDE支持!

工具的使用:
一旦你的C源文件里包括了这些好东西,则必须用TCC.EXE的COMMAND-LINE来编译,具体的命令参数TCC.EXE已经提供,这里不复阐述了.最简单的是:TCC C源文件名(使用这个方法,TCC会自动调用TASM.EXE和TLINK.EXE,并且能够使TLINK.EXE正确的找到需要的.obj和.lib文件,如果你单步编译的话,可能会碰到很多的问题,主要是TLINK.EXE它自己并不会去找.obj和.lib文件,你自己可以建一个.bat文件,如果要指定.lib文件的目录的话可以用/L参数,在文章的后面有一个例子).但大家要注意了,看一下你的TC目录下面到底是否有TASM.EXE文件,并在TURBOC.CFG(这个文件包括TCC.EXE运行期参数,这里面所有参数在运很期都将被自动TCC.EXE使用,例如:-IH:/TC/INCLUDE/
-LH:/TC/LIB/)文件中设置好一些参数,并确认TASM.EXE的版本号要2.0以上,以及是否能够向下兼容.但是在大多数的情况下TC的目录是没有TASM.EXE的,或是版本不正常.
如果你有TASM.EXE文件并且TURBOC.CFG文件也已经写好了,但是还要注意一个
问题:运行TCC.EXE时要在独立的DOS SHELL下面(不要害怕,这不是一个新东西,我的意思
是,不在诸如TC下的DOS SHELL下面运行,我曾经败在这个问题下,当我发现时直想揍电脑
一顿,还好没有,不然就没有这篇文件了.)
还有一句重要的话:TC2.0支持大部分8086指令(当然用法有一些约定,不过现在我并不打算
进行详细说明,因为那是一件很繁杂的事,以后有时间或许会写出来----如果大家需要的话).
如果说上面我所说的那些约定很繁杂的话,那么下面的方法该是多么简单啊!
让我们使用Borland为TC2.0内建的变量来进行伪汇编.
或许你还不知道在TC2.0中还有一些内建的pseudo寄存器(可以看作是register 型的变量,但是它们比register型的变量好用的多)
_AX,_AH,_AL,
_BX,_BH,_BL,
_CX,_CH,_CL,
_DX,_DH,_DL,
_DI,_SI,_SP,
_CS,_DS,_ES,_SS
注意这些寄存器的size,_AX,_BX,_CX,_DX,_CS,_DS,_ES,_SS,_SI,_DI,_SP等都是16位的寄存器相当于C语言的unsigned int类型,其余的都是8位的寄存器(相当于unsigned char)(TC怎么可能支持32位的寄存呢,所以EAX等是不能用的,FS,GS和IP寄存器都是无效的),还有就是在传递参数的时候千万不要忘记使用强制类型转换.
中断调用指令是:__int__(interrupt_#)(注意int的前辍和后辍都是两个underscores)
For example:
#include<dos.h>
unsigned int _stklen=0x200;
unsigned int _heaplen=0;

main()
{
_DX=(unsigned int)"Hello,world./r/n$";
_AX=0x900;
__int__(0x21);

}
dos.h它是包含__int__()内建中断调用语句的头文件,因此是不可
缺少的._stklen和_heaplen是定义运行期堆栈和堆大小的两个内部
引用变量(这是个我自己想的名词,意指如果这两个变量在源文件中
显式的声明了,那么编译程序会自会引用来构造编译时期的信息以产生
用户希望的目标文件,如果不显式的声明则编译程序自动确定).
这两个变量也有一些约定,如果_stklen不显式声明,_heaplen赋值为零
都表示栈和堆都是defult的.
最后在TC2.0中还有一个没有说明的标志位寄存器flags,它也是内建
pseudo寄存器是:_FLAGS,是一个16位寄存器.这些内建的寄存器都可以进行
运算,但是要注意它们所代表的类型(必要时进行类型转换);
看起来这是不是一种好的办法啊(而且使用这种方法只要用个一个dos.h头文件就好,
不需要用TCC编译,可以直接在TC20的IDE下编译).
TC2.0中也提供了一些简单好用的函数来实现对DOS功能的调用如:
int86(...),int86x(...)(但是这些方法实际仍然要调用函数,所以不如使用
伪寄存器,又因为要牵涉到union REGS结构的内存分配所以系统的开销是增大了,
而使用伪寄存器是最简洁的),端口通信函数如:inportb(...),inport(...),
outportb(...),outport(...),指针转换函数:FP_OFF,FP_SEG,MK_FP,这些函数在
帮助系统中都有,有用时大家可以查阅.

tlinkbat.bat的例子:
rem The lib environment variable is the directory of the .obj and .lib file
set lib=h:/tc/lib/
rem 这下面的句子中的c0s(C 零S)是一个.OBJ文件,是一个C程序的STARTUP文件
tlink %lib%c0s %1,%1,%1,/L%lib%emu.lib %lib%maths.lib %lib%cs.lib
set lib=
(使用时可将以rem开头的句子删除)

___________________________________________________
一些约定:
我们先说一下在TC20下写汇编(内联汇编--自己起的名字,大家可以想叫什么叫什么)时的编译器的编译原则:
1.所有在main()函数外的的汇编语言的语句都作为数据声明语句处理,也即在编译器编译时会将它放在数据段中,如:
asm string1 db "Hello",,,'world!',0ah,0xd,"$"
main()
{
asm mov dx,offset string1
asm mov ah,9
asm int 33
asm mov dx,offset string2
asm int 33
}
asm string2 db "the string can be declared after the main() function!$"
象这些样子在main()外面的汇编语言的数据定义语句(事实上不管是什么汇编语句,
只要是在main()之外,包括这个句子:asm mov ax,0x4c00),在编译后都放在数据段中,而C语言的数据声明语句仍按C的规则!
2.所有在main()函内的汇编语言的语句在编译后都放在代码段中,包括这个句子:
asm string2 db "the string can be declared after the main() function!$"
3.不要在以asm 开头的语句中使用C语言的关键字,这会导致编译阶段的错误

那么,根据这三条大家会得到什么样的结论呢?(先闭上眼想一想,你可能会由此变的
很赞赏自己,是的你应该这样相信自己是对的!)
让我们一起看一下这个结论:
1.根据编译原则1得到:不可以在main()外面写汇编命令语句(不要笑,正是与C语言相同才值得注意!),在任何地方都不要进行任何的段定义和宏定义(这是因为编译后的形式决定的,也即:在TC20下所有的汇编格式的语句只能是,直接性的数据定义和语句指令)!
2根据编译原则2得到:不可以在main()之内使用汇编的语句进行数据定义(同样不要笑,
大多数人在第一次在TC20下写汇编都会有这样的错误的)
3.如同类强制类型这样的事是不可以在以asm开头的汇编语句中使用的
好了,天即朗,气瞬清!这样一说,一个大体的框架就出来了!只要遵守这个原则写,就可避免很多莫名其妙的错误出现!
通俗的说:
汇编语句的数据定义放在main()外面,指令放在main()里面.
如果你没有更好的文档,那么记住我的这些话!

一些细节的问题:
在以asm开头的内联汇编语句中是不支持C的转义字符的,但是用C语言声明一个字符数组(含有转义字符的),然后用int 33 ah=9这功能时输出这个字符串时,其中的转义字符是有效的(这主要是因为编译后其内部表示形式不同造成的,自己想想会有答案的).
内联汇编支持C的一些如数值表示,字符串声明格式等,
如:一个十六进制的数据可以用两种方式表示:0xa 和0ah,字符串可以是这样:
"Hello,world!$"(如同C)也可以这样'Hello,world!$'(用汇编自己的方式).
象C一样你同样要注意赋值的类型,而且要比C更严格(汇编从来不自己动手做
如同类型转换啊这样事),所以一切的事完全要你自己做好!而且你不要企图以C的形式
做这件事,如这样的格式 asm mov dx,(unsigned)a(a是一个这样的东西,
char a[ ]="hello,world!";),而且这样句子也会导致错误:asm mov dx,word ptr a(逻辑错误),不过这不是在编译时的错误,而是运行期的错误(具体的原因自己想一想,象word label这样的东西的运算作用和会导致的后果),你可以这样用一个句子做"中间人"如int i=(unsigned)a;asm mov dx,i(也千万不要用asm mov dx,(unsigned)a 这样的句子.但是,告诉大家一个好消息,你可以用指针指向一个字符串,然后你会惊讶你竟然可以这样:
char *p="hello,world";asm mov dx,p,然后用int 33 ah=9的功能输出这个字符串而不会有错误(这也表现出指针的特点,它是一个二字节的(TC20下)变量,含有的是一个地址,这与其指向的变量的类型是毫无关系的).
内汇汇编语句不支持->这个运算符.还有标号的问题,在最后的例子中你会年看到一些特别之处!

上面所说的只是很细小并微少的一些事(也是很常遇到的),尚有很多的细节要说,但由于本人时间有限不能一一列举,如C的结构在内联汇编的应用等大家可以按照其运行机理去想想一下用法;另外,由于这只是一件学习的事,所以还是大家自己学(找一下有关文档,当然现在已经没有什么比较完整的了),情况会好的多,我在对内联汇编的学习过程中领会到了不少的东西,例如编译原理方面的知识,以及如何做会使代码更高效,占空间最少等的方法.最后向大家推荐一种方法,在利用TCC的-S开关可以生成C源文件的汇编代码
(或许很多的人都用过)是很好的学习材料!祝大家学有所成!

Cstarter
02-11-17

/* 由于个人的时间和能力有限,难免有错误和不详细的地方,请大家见谅!
My Email:[email protected] [email protected] QQ:170594633 */
一些例子:
下面这个例子是对沈美明 温冬婵的
<<IBM-PC 汇编语言程序设计>>清华版第十一章程序的改写
可直接在命令行上键入 tcc filename 就可以,当然你要有TASM.EXE
/*
asm mus_frep dw 330,294,262,294,3 p(330)
asm dw 3 p(294),330,392,392
asm dw 330,294,262,294,4 p(330)
asm dw 294,294,330,294,262,-1
asm mus_time dw 6 p(25),50
asm dw 2 p (25,25,50)
asm dw 12 p(25),100
*/
asm mus_frep dw 330,392,330,294,330,392,330,294,330
asm dw 330,392,330,294,262,294,330,392,294
asm dw 262,262,220,196,196,220,262,294,330,262
asm dw -1
asm mus_time dw 3 p (50),25,25,50,25,25,100
asm dw 2 p (50,50,25,25),100
asm dw 3 p (50,25,25),100

main()
{
asm jmp start
/*设置发声的频率,这一段在沈美明 温冬婵的
<<IBM-PC 汇编语言程序设计>>清华版第十一章有详细的说明 */

sound:
asm mov al,0b6h
asm out 43h,al
asm mov dx,12h
asm mov ax,533h*896
asm div di
asm out 42h, al
asm mov al,ah
/* 这个延时是用来防止两次IO操作的最后一次操作的错误,
因为CPU比总线的速度快很多,所以 要延时等待第一次操作完成后再进行第二次操作*/

asm mov cx,1000
delay:
asm loop delay

asm out 42h,al
asm in al,61h
asm mov ah,al
asm or al,3
asm out 61h,al

/* 使用中断15H功能86H延时CX:DX=微秒数*/
asm mov ax,2710h
asm mul bx
asm mov cx,dx
asm mov dx,ax
asm mov ah,86h
asm int 15h /*可用__int__(0x15);代替*/

asm mov al,ah
asm out 61h,al
asm jmp add_count
/*------------------*/
start:
asm mov si,offset mus_frep
asm lea bp,mus_time
frep:
asm mov di,[si]
asm cmp di,-1
asm je end_mus
asm mov bx,[bp]
asm jmp sound
add_count: /*标号不能用汇编语言写*/
asm add si,2
asm add bp,2
asm jmp frep
end_mus:;

}

对于上面的程序大家可用伪寄存器的方法写一个,要容易的多!

/*一个发声程序!(引自<<PC技术内幕>>电力版--这个版不好,不如清华版的)*/
#include"dos.h"
main()
{
static union REGS ourregs;
outportb(0x43,0xb6);
outportb(0x42,0xee);
outportb(0x42,0);
outportb(0x61,(inportb(0x61)|0x03));
ourregs.h.ah=0x86;
ourregs.x.cx=0x001e;
ourregs.x.dx=0x8480;
int86(0x15,&ourregs,&ourregs);
outportb(0x61,(inportb(0x61)&0xfc));
}

② 在TC2.0上写好程序怎么保存编译,连接

保存按F2
编译是ALT+C里面的第一个
连接时ALT+C里面的第二个
运行是ALT+R的第一个,看结果是ALT+F5

③ 怎么把C语言文件转换成EXE文件啊

要先编译才行的,记住计算机暂时只能读懂机器语言,所有的高级语言也需要编译后才能执行,当然C也不会例外,C语言只要用编译器Compile之后就会出现EXE文件了。

④ 用tc2.0如何编译程序

选中.c文件右击打开方式选择你安装tc2.0的目录然后选择tc2.0.exe进去后按F10可以进入上面的菜单,在Compile菜单下点击make exe file在点击Run菜单下的run,另外需注意tc下要输出必须在最后加上 getch()();

⑤ C语言程序设计找错

相信你用的是TC20:
1.这个程序中b,c是整型,因为TC20是16位模式,int型存储空间只有2字节,无符号最大才65535,你那个计算出来的值太大,所以就错了,把int b,c;改为long b,c;,printf中改为"%ld"就好了.楼上说的tc30是32位模式,int型是4字节,和原来的long长度一样,所以没问题

2.同上

3.这个也是TC20的BUG,你需要手动连接浮点库,在程序main开始加以下的语句:
float arg,*point=arg;
其中arg,point只要不和其他变量名重合就可以了
-------------------------------------
非要解释清楚的话是这样的:首先大的方面还是我说的那个,具体操作的时候是受自动类型转换的影响,c=a/10000; 这个式子中a/10000的结果是9,就像你说的"在不超出整型的范围内,长整型是可以付值给整型数据的",下面b=(a-c*10000)/1000; 这句中由于c和10000都在整型范围,所以按整型计算,c*10000不等于90000,而是取低位,值为24464,这样(a-24464)/1000就有了74这个结果了.

第二条是同样的原理,90000和98765都被解释为长整型常量,相减就没问题,而9和10000都被解释为整型常量,结果就出问题了

你可以试试改为这样的式子b=(a-c*10000l)/1000;在10000后面加小写的L,表示10000是长整型常量,按自动类型转换结果也成了长整型,b的结果也就对了

⑥ 怎样用TC20运行程序

多数软件都可以使用下面的规律:

. 一般各项功能都可以在菜单里面找到,比如编译为EXE文件,以及运行此文件,这些操作都有相应的菜单项目。而菜单项目的后面有提示快捷键,对于经常需要做的操作,你会不知不觉的就记得了快捷键,无需死记硬背。

⑦ 在TC中,怎样用命令编译lib库

定义函数库的方法及应用:
一、2个相关的命令
1、TCC——TC的DOS下的命令行编译连接工具
2、TLIB——TC的DOS下的库操作工具
二、1个自定义的函数库的例子
1、
在TC集成环境下,编一个文件USERADD.C
#define
_NO_MAIN
int
add(int
*a,int
*b)
{
int
c;
c=(*a)+(*b);
return
c;
}
按ALT—F9编译
生成一个
USERADD.OBJ文件。
2、按F10—F—O
退到DOSSHELL(DOS环境下)
COPY
USERADD.OBJ

..\LIB目录,在\LIB目录下执行
TLIB
USERLIB.LIB+USERADD.OBJ
就生成了一个自己的函数库
USERLIB,在这个函数库里就包含了函数模块
int
add(int
*a,int
*b)
的二进制代码。现在已经将自定义的函数放进了函数库,就可以把原文件USERADD.C删掉不要了。(当然,为了以后维护方便,还是作一个备份为好)。
以后如有其它的函数模块,也可以编译后用TLIB
命令加入到这个函数库里。
3、写一个包含文件
USER1.H,写完后COPY到INCLUDE
目录。内容如下:
int
add(int
*,int
*);
4、作好了以上的自定义函数库的准备工作,现在就可以使用了。
写一个程序,取名为ADD-1.C,在程序中调用库函数add(
);
#include
#include
void
main(
)
{
int
a,b,c;
a=20;b=30;
c=add(&a,&b);
printf(“%d”,c);
}
5、在DOS命令行下,执行
TCC
ADD-1.C
..\LIB\USERLIB.LIB
就OK!
运行ADD-1.EXE,可以看到输出结果
50
Tc生成lib的方法:
扩展库与自建LIB库使用扩展库TC所带的库在有的情况下是无法满足功能要求的,自己写一个太麻烦,找到了一个LIB库又怕不会用。在WIN-TC中,对于使用外部的扩展库(第三方LIB)提供了一个方便的解决方法:首先要确定你的LIB库是FOR
TC版本的而不是FOR
VC或是其它的。如果确定是FOR
TC的版本的话就把你的首标文件(或称头文件),就是扩展名为*.h的文件拷贝到WIN-TC的include目录里,然后把相应名称的*.lib文件拷贝到lib目录,然后再运行WIN-TC时选择“编译配置”菜单项,你会看到扩展库信息栏目里有你的LIB库文件名在上面了,但是没有打钩。然后你把它钩选后再“确定”保存,以后的编译程序时就自动链接该扩展库了。自建立LIB库将自己的代码编译成LIB库的格式有利与保护自己的代码版权。如何来生成自己的LIB库呢?请按照下面的方法:
STEP
1——生成目标代码(OBJ)
建立mylib的代码文件/*********************
mylib.c
*********************/void
myfun(){printf("
myfun()
in
mylib.lib
");}然后保存为WIN-TC目录下的mylib.c文件然后到菜单项:运行->编译设置
看看“产生
OBJ
文件”是否已选择,若未选择则选择之。然后回到主界面,点“编译链接”按钮(F9

⑧ 在TC20中, int i=65536; printf("%d\n",i);的输出结果是

lz是想实验
short
i=65536;printf("%d\n,i);吧
是的话输出结果是0
我看了下反汇编的结果,给你解释下为什么是0吧
65536对应的16进制数十10000h,
short
i=65536经过汇编之后的结果是
mov
[i],10000h
i只占16位对应10000h的低16位,最高位的1由于存不下了就自动舍弃掉了,所以i的值为0
不知道其他编译器是不是也是这么处理的,我估计应该差不多,
忘说了,我的ide是vs2010

⑨ 如何把C语言文件转换成EXE文件

C语言文件是指.c类型的文件(源文件)吗?
在编译器中找一下“编译”(Compile)或“生成”(Build)等命令,一般快捷键是F5,即可在源文件旁Debug文件夹中生成一个同名的.exe应用程序。生成的话一般在生成后会运行该程序。

⑩ 我刚下了个tc编辑器不会用,谁能告示我怎么用

Turbo C
Turbo C是Borland公司的产品,早期最经典的C语言编译器,TC 2.0倍受程序员的青睐。

新版本有TurboC++3.0

Turbo C的优点是 体积小---小于5兆,功能还全,适合教学。

不足是 Dos界面,TC 2.0还不支持鼠标,受界面所限编辑功能不好。

下面是它的安装以及使用:
下载后,用Winzip解压缩,用默认的目录即是c:\unzipped\tc20,不过一般你不想将程序放在unzipped目录下吧,即使放在这里,你也会发现它不好使.可能会出现某某文件找不到的错误.不要紧,这里有几个解决方案:

一,什么都不要动,把tc20目录改为tc后,放到c盘跟目录下只要tc目录里面的文件不坏,应该就能正常运行.

二,如果你不想将它放到c盘跟目录下,也行.比如你放到了d:\turboc\目录下.步骤:

打开tc的IDE编辑界面,选options菜单,打开后,选directories子菜单.现在你将会看到几个路径:

Include Directories, Library Directories, Output Directories,Source Directories四项

看一看你的tc目录的路径,里面有include目录和lib目录.将这两个目录的完整路径分别写上,哈哈这下行了吧.

以下是正规的c语言安装方式,适用于有安装文件的tc用。

Turbo C 2.0的安装非常简单, 只要将1#盘插入A驱动器中, 在DOS的"A>" 下键入:
A>INSTALL
即可, 此时屏幕上显示三种选择:
1. 在硬盘上创造一个新目录来安装整个Turbo C 2.0系统。
2. 对Turbo C 1.5更新版本。
这样的安装将保留原来对选择项、颜色和编辑功能键的设置。
3. 为只有两个软盘而无硬盘的系统安装Turbo C 2.0。
这里假定按第一种选择进行安装, 只要在安装过程中按对盘号的提示, 顺序插
入各个软盘, 就可以顺利地进行安装, 安装完毕将在C盘根目录下建立一个TC 子目
录, TC下还建立了两个了目录LIB和INCLUDE, LIB子目录中存放库文件, &127;INCLUDE
子目录中存放所有头文件。
运行Turbo C 2.0时, 只要在TC 子目录下键入TC并回车即可进入Turbo C 2. 0
集成开发环境。

阅读全文

与tc20结果怎么编译相关的资料

热点内容
字母h从右往左跑的c语言编程 浏览:127
安卓手机如何拥有苹果手机横条 浏览:763
业余编程语言哪个好学 浏览:135
按照文件夹分个压缩 浏览:104
航空工业出版社单片机原理及应用 浏览:758
如何在电信app上绑定亲情号 浏览:376
安卓的怎么用原相机拍月亮 浏览:805
配音秀为什么显示服务器去配音了 浏览:755
c盘清理压缩旧文件 浏览:325
app怎么交付 浏览:343
图虫app怎么才能转到金币 浏览:175
如何做征文app 浏览:446
用什么app管理斐讯 浏览:169
安卓如何下载宝可梦剑盾 浏览:166
编译器开发属于哪个方向 浏览:940
megawin单片机 浏览:687
以色列加密货币监督 浏览:909
程序员前端现在怎么样 浏览:499
服务器和接口地址ping不通 浏览:557
linux命令返回上级目录 浏览:899