TC 2.0 学习总结
生活随笔
收集整理的這篇文章主要介紹了
TC 2.0 学习总结
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
《珍藏TC2.0》: TCC.exe,TLink.exe,TLib.exe 命令行選項(xiàng)及其使用!
http://blog.csdn.net/chenggil10/article/details/4176233? ?
在開始看本文以前,我先說明一下C語言的安裝和使用中最應(yīng)該注意的地方:?
許多網(wǎng)友在下載Turbo C 2.0和Turbo C++ 3.0后,向我問得最多的是在使用過程中碰到如下問題:?
1)出現(xiàn)找不到 stdio.h conio.h等include文件;?
2)出現(xiàn)cos.obj無法連接之類的錯(cuò)誤?
這些問題是由于沒有設(shè)置好路徑引起的,目前下載的TC2,TC3按安裝分類大概有兩種版本:一是通過install安裝,這類應(yīng)該已經(jīng)設(shè)置好了路徑;二是直接解壓后建立TC.EXE的快捷方式,在WINDOWS下雙擊即可運(yùn)行(DOS下直接運(yùn)行TC.EXE),目前國(guó)內(nèi)大多為這種,(因?yàn)榍岸挝覍⒆约荷蟼髟?69網(wǎng)絡(luò)家園的TC2英文版推薦給十多家軟件站),因此下載使用前請(qǐng)注意路徑設(shè)置:?
設(shè)置方法為: OPTION->DIRECTORIES:?
INCLUDE: [TC2/3所在目錄]/include?
LIB: [TC2/3所在目錄]/lib?
output輸出目錄請(qǐng)自己設(shè)置一個(gè)工作目錄,以免混在一起。?
最后還提醒一點(diǎn):FILES中的Change dir(改變當(dāng)前目錄)中應(yīng)設(shè)置為當(dāng)前程序所在目錄。?
一、C語言的起源?
C 語言是1972年由美國(guó)的Dennis Ritchie設(shè)計(jì)發(fā)明的, 并首次在UNIX操作系統(tǒng)?
的 DEC PDP-11 計(jì)算機(jī)上使用。 它由早期的編程語言 BCPL( Basic Combind?
Programming Language) 發(fā)展演變而來。在1970年, AT&T 貝爾實(shí)驗(yàn)室的 Ken?
Thompson根據(jù)BCPL語言設(shè)計(jì)出較先進(jìn)的并取名為 B的語言, 最后導(dǎo)了C 語言的問世。?
隨著微型計(jì)算機(jī)的日益普及, 出現(xiàn)了許多C 語言版本。由于沒有統(tǒng)一的標(biāo)準(zhǔn),?
使得這些C 語言之間出現(xiàn)了一些不一致的地方。為了改變這種情況, 美國(guó)國(guó)家標(biāo)準(zhǔn)?
研究所(ANSI)為C 語言制定了一套ANSI標(biāo)準(zhǔn), 成為現(xiàn)行的C語言標(biāo)準(zhǔn)。?
二、C 語言的特點(diǎn)?
C 語言發(fā)展如此迅速, 而且成為最受歡迎的語言之一, 主要因?yàn)樗哂袕?qiáng)大的?
功能。許多著名的系統(tǒng)軟件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 語言編寫的。?
用C 語言加上一些匯編語言子程序, 就更能顯示C 語言的優(yōu)勢(shì)了, 象PC- DOS 、?
WORDSTAR等就是用這種方法編寫的。歸納起來C 語言具有下列特點(diǎn):?
1. C是中級(jí)語言?
它把高級(jí)語言的基本結(jié)構(gòu)和語句與低級(jí)語言的實(shí)用性結(jié)合起來。C 語言可以象?
匯編語言一樣對(duì)位、字節(jié)和地址進(jìn)行操作, 而這三者是計(jì)算機(jī)最基本的工作單元。?
2. C是結(jié)構(gòu)式語言?
結(jié)構(gòu)式語言的顯著特點(diǎn)是代碼及數(shù)據(jù)的分隔化, 即程序的各個(gè)部分除了必要的?
信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦? 便于使用、維護(hù)以及調(diào)?
試。C 語言是以函數(shù)形式提供給用戶的, 這些函數(shù)可方便的調(diào)用, 并具有多種循?
環(huán)、條件語句控制程序流向, 從而使程序完全結(jié)構(gòu)化。?
3. C語言功能齊全?
C 語言具有各種各樣的數(shù)據(jù)類型, 并引入了指針概念, 可使程序效率更高。另?
外C 語言也具有強(qiáng)大的圖形功能, 支持多種顯示器和驅(qū)動(dòng)器。而且計(jì)算功能、邏輯?
判斷功能也比較強(qiáng)大, 可以實(shí)現(xiàn)決策目的。?
4. C語言適用范圍大?
C 語言還有一個(gè)突出的優(yōu)點(diǎn)就是適合于多種操作系統(tǒng), 如DOS、UNIX,也適用于?
多種機(jī)型。?
三、 Turbo C 概述?
1 Turbo C 的產(chǎn)生與發(fā)展?
Turbo C 是美國(guó)Borland 公司的產(chǎn)品,Borland公司是一家專門從事軟件開發(fā)、?
研制的大公司。該公司相繼推出了一套 Turbo系列軟件, 如Turbo BASIC, Turbo?
Pascal, Turbo Prolog, 這些軟件很受用戶歡迎。該公司在1987年首次推出Turbo?
C 1.0 產(chǎn)品, 其中使用了全然一新的集成開發(fā)環(huán)境, 即使用了一系列下拉式菜單,?
將文本編輯、程序編譯、連接以及程序運(yùn)行一體化, 大大方便了程序的開發(fā)。1988?
年, Borland 公司又推出Turbo C1.5版本, 增加了圖形庫和文本窗口函數(shù)庫等, 而?
Turbo C 2.0 則是該公司1989年出版的。Turbo C2.0在原來集成開發(fā)環(huán)境的基礎(chǔ)上?
增加了查錯(cuò)功能, 并可以在Tiny模式下直接生成.COM (數(shù)據(jù)、代碼、堆棧處在同一?
64K 內(nèi)存中) 文件。還可對(duì)數(shù)學(xué)協(xié)處理器 (支持8087/80287/80387等)進(jìn)行仿真。?
Borland 公司后來又推出了面向?qū)ο蟮某绦蜍浖黅urbo C+ + , 它繼承發(fā)展?
Turbo C 2.0 的集成開發(fā)環(huán)境, 并包含了面向?qū)ο蟮幕舅枷牒驮O(shè)計(jì)方法。?
1991年為了適用Microsoft 公司的Windows 3.0 版本, Borland 公司又將Turbo?
C++ 作了更新, 即Turbo C 的新一代產(chǎn)品Borlandc C++也已經(jīng)問世了。?
2 Turbo C 2.0基本配置要求?
Turbo C 2.0可運(yùn)行于IBM-PC系列微機(jī), 包括XT, AT及IBM 兼容機(jī)。 此時(shí)要求?
DOS 2.0或更高版本支持, 并至少需要448K的RAM, 可在任何彩、單色80列監(jiān)視器上?
運(yùn)行。支持?jǐn)?shù)學(xué)協(xié)處理器芯片, 也可進(jìn)行浮點(diǎn)仿真, 這將加快程序的執(zhí)行。?
3 Turbo C 2.0內(nèi)容簡(jiǎn)介?
Turbo C 2.0有六張低密軟盤(或兩張高密軟盤)。下面對(duì)Turbo C 2.0的主要文?
件作一簡(jiǎn)單介紹:?
INSTALL.EXE 安裝程序文件?
TC.EXE 集成編譯?
TCINST.EXE 集成開發(fā)環(huán)境的配置設(shè)置程序?
TCHELP.TCH 幫助文件?
THELP.COM 讀取TCHELP.TCH的駐留程序?
README 關(guān)于Turbo C的信息文件?
TCCONFIG.EXE 配置文件轉(zhuǎn)換程序?
MAKE.EXE 項(xiàng)目管理工具?
TCC.EXE 命令行編譯?
TLINK.EXE Turbo C系列連接器?
TLIB.EXE Turbo C系列庫管理工具?
C0?.OBJ 不同模式啟動(dòng)代碼?
C?.LIB 不同模式運(yùn)行庫?
GRAPHICS.LIB 圖形庫?
EMU.LIB 8087仿真庫?
FP87.LIB 8087庫?
*.H Turbo C頭文件?
*.BGI 不同顯示器圖形驅(qū)動(dòng)程序?
*.C Turbo C例行程序(源文件)?
其中: 上面的?分別為:?
T Tiny(微型模式)?
S Small(小模式)?
C Compact(緊湊模式)?
M Medium(中型模式)?
L Large(大模式)?
H Huge(巨大模式)
[[[四 重要文件的說明?
1, TCC.EXE 和 TC.EXE ? ??
Turbo c包有兩種編譯器,集成開發(fā)環(huán)境下的叫做TC.EXE和命令行方式的叫做TCC.EXE.?
集成開發(fā)環(huán)境包括:集成編輯器、命令行編譯器、連接器、調(diào)試器。
Trubo C的命令行編譯連接?
所謂命令行編譯,是指在dos下,調(diào)用Trubo C的tcc.exe程序.來完成對(duì)turbo C源程序的編譯連接工作.當(dāng)選擇對(duì)后綴為*.asm的匯編程序文件編譯時(shí),tcc還要調(diào)用TASM后才能對(duì)后綴為.asm的文件進(jìn)行編譯,這種方式適合于c程序與匯編語言混合編程的編譯連接,當(dāng)c程序嵌入?yún)R編指令時(shí),也必須用此方法編譯連接。?
命令行編譯的格式為:?
tcc [選項(xiàng)1 選項(xiàng)2 ...]文件名1 文件名2...其中選項(xiàng)是指對(duì)后面給出的文件進(jìn)行連接時(shí)的選擇項(xiàng),可選的常用選擇項(xiàng)如下所示:每個(gè)選項(xiàng)前都帶有"-"號(hào),且大小寫是區(qū)分的。文件名是指源文件.c或目標(biāo)文件.obj或庫文件.lib當(dāng)不指定只編譯不連接時(shí),tcc將完成編譯和連接兩個(gè)步驟,對(duì).lib庫只進(jìn)行形式上的連接,標(biāo)準(zhǔn)庫用戶不用進(jìn)行連接。?
例如:?
tcc -ib:/include -lb:/lib -etest start.c body.obj myc當(dāng)執(zhí)行該命令時(shí),表示將start.c源文件和body.obj目標(biāo)文件及myc.c(命令行中該文件無后綴),分別進(jìn)行編譯(對(duì)body.obj文件不再編譯),然后連接生成名為test的執(zhí)行文件test.exe(由-test給出).?
-ib:/include 表示包含文件的路徑是b:/include?
-ib:/lib 表示庫文件的路徑是b:/lib?
又例如:?
tcc -ms -efile -lc:/tc/lib file1 file2.obj graphics.lib?
其中-ms表示選擇小內(nèi)存模式進(jìn)行編譯,它也是turbo c的缺省編譯模式,將file1進(jìn)行編譯,然后和file2.obj 及graphics.lib進(jìn)行連接.生成file.exe的可執(zhí)行文件.其中g(shù)raphcis.lib庫的路徑為c:/tc/lib,即意為在c:/tc/lib目錄下去尋找graphics.lib文件.當(dāng)進(jìn)行混合編程時(shí),如果已有匯編程序s3.asm其命令行可寫為?
tcc ic:/tc/include -lc:/tc/lib -mm s1 s2 s3.asm mylib.lib?
表示用中模式(-mm)編譯源文件s1.c和s2.c,調(diào)用TASM對(duì)s3.asm進(jìn)行編譯,然后連接生成可執(zhí)行文件s1.exe,編譯時(shí),到c:/tc/include目錄中去找包含文件,到?
c:/tc/lib目錄中去找?guī)煳募ylib.lib.
tcc的幫助:?
Turbo C Version 2.0 Copyright (c) 1987, 1988 Borland International?
Syntax is: TCC [ options ] file[s] ? ? ? * = default; -x- = turn switch x off?
-1 80186/286 Instructions -A Disable non-ANSI extensions?
-B Compile via assembly -C Allow nested comments?
-Dxxx Define macro -Exxx Alternate assembler name?
-G Generate for speed -Ixxx Include files directory?
-K Default char is unsigned -Lxxx Libraries directory?
-M Generate link map -N Check stack overflow?
-O Optimize jumps -S Produce assembly output?
-Uxxx Undefine macro -Z Optimize register usage?
-a Generate word alignment -c Compile only?
-d Merge duplicate strings -exxx Executable file name?
-f * Floating point emulator -f87 8087 floating point?
-gN Stop after N warnings -iN Maximum identifier length N?
-jN Stop after N errors -k Standard stack frame?
-lx Pass option x to linker -mc Compact Model?
-mh Huge Model -ml Large Model?
-mm Medium Model -ms * Small Model?
-mt Tiny Model -nxxx Output file directory?
-oxxx Object file name -p Pascal calls?
-r * Register variables -u * Underscores on externs?
-v Source level debugging -w Enable all warnings?
-wxxx Enable warning xxx -w-xxx Disable warning xxx?
-y Produce line number info -zxxx Set segment names
2, TLINK.EXE 為連接程序,把各個(gè)obj文件連接程exe文件?
? ? obj文件是什么??
? ? 目標(biāo)文件,其內(nèi)容為 完成某種功能的代碼,只不過存儲(chǔ)的機(jī)器碼.?
? ? 可以這樣理解 目標(biāo)文件 即為 子程序或子函數(shù)?
? ? tlink.exe作用是什么??
? ? 把 啟動(dòng)代碼(也是obj文件,負(fù)責(zé)設(shè)置環(huán)境,調(diào)用main函數(shù),等作用) + main函數(shù)所在obj +main函數(shù)所用到的obj 連接起來生成exe文件.?
3, TLIB.EXE 對(duì)lib文件進(jìn)行操作的一個(gè)工具.?
? ? lib文件是什么??
? ? obj文件的集合,可以使用tlib.exe 從lib文件中取出obj文件,向lib文件加入obj文件,等操作?
4, *.h文件?
? ? 在include文件夾中包含了turbo c提供的庫函數(shù)說明,只是說明而已?
? ? 如果用戶需要使用某個(gè)函數(shù)功能,需要把對(duì)應(yīng)的頭文件包含進(jìn)來?
? ? 當(dāng)然用戶可以定義自己頭文件?
5, 設(shè)置路徑?
? ? TC集成開發(fā)環(huán)境中設(shè)置 Options/Directories下設(shè)置 include,lib路徑?
? ? 使用命令行編譯的話 需要對(duì)TURBOC.CFG文件進(jìn)行編輯就可以了(使用純文本編輯器就可以)?
[[[[五 建造自己的編輯環(huán)境?
這個(gè)過程,實(shí)際上是為了了解turbo c對(duì)c語言的編譯,連接過程.并加深對(duì)編譯,連接,obj,lib的理解?
建立一個(gè)新的文件夾(以后用到什么,則從tc下拷貝過來)?
1 ? 使用dos自帶的edit編輯器?
2 ? 使用tcc作為編譯器?
3 ? 使用tlink作為連接器?
實(shí)際上還是需要其他文件比如 c0s.obj ,cs.lib,等?
例子: 對(duì)a.c進(jìn)行編譯連接?
編譯:tcc -c a.c ? ? ? ? //只對(duì)a.c進(jìn)行編譯 生成a.obj?
連接:tlink c0s a,a,,cs ? ?//把 啟動(dòng)代碼 和 a的代碼 連接起來,這個(gè)過 ? ? ?程中還需要用到cs.lib中的一些代碼?
也可以 tcc a.c ? 同時(shí)完成編譯連接?
注意:在使用到圖形庫的時(shí)候,需要把graphics.lib顯示輸入,例如:tcc a.c graphics.lib?
寫個(gè)程序,看看是否可以編譯,連接成功??
大家可以試試?
[[[[六 說明?
獻(xiàn)給開始學(xué)習(xí)c語言的朋友?
文章1,2,3部分 取自網(wǎng)上資料?
推薦文章:http://www.3800hk.com/Article/cxsj/cjing/jcjccj/2005-08-06/Article_18835.html?
四、 Turbo C 2.0的安裝和啟動(dòng)?
Turbo C 2.0的安裝非常簡(jiǎn)單, 只要將1#盤插入A驅(qū)動(dòng)器中, 在DOS的"A>" 下鍵?
入:?
A>INSTALL?
即可, 此時(shí)屏幕上顯示三種選擇:?
1. 在硬盤上創(chuàng)造一個(gè)新目錄來安裝整個(gè)Turbo C 2.0系統(tǒng)。?
2. 對(duì)Turbo C 1.5更新版本。?
這樣的安裝將保留原來對(duì)選擇項(xiàng)、顏色和編輯功能鍵的設(shè)置。?
3. 為只有兩個(gè)軟盤而無硬盤的系統(tǒng)安裝Turbo C 2.0。?
這里假定按第一種選擇進(jìn)行安裝, 只要在安裝過程中按對(duì)盤號(hào)的提示, 順序插?
入各個(gè)軟盤, 就可以順利地進(jìn)行安裝, 安裝完畢將在C盤根目錄下建立一個(gè)TC 子目?
錄, TC下還建立了兩個(gè)了目錄LIB和INCLUDE, LIB子目錄中存放庫文件, INCLUDE?
子目錄中存放所有頭文件。?
運(yùn)行Turbo C 2.0時(shí), 只要在TC 子目錄下鍵入TC并回車即可進(jìn)入Turbo C 2. 0?
集成開發(fā)環(huán)境。?
五、 Turbo C 2.0集成開發(fā)環(huán)境的使用?
進(jìn)入Turbo C 2.0集成開發(fā)環(huán)境中后, 屏幕上顯示:?
──────────────────────────────?
File Edit Run Compile Project Options Debug Break/watch?
┌────────────Edit──────────────┐?
│ Line 1 Col 1 Insert Indent Tab File Unindent c:NONAME.C│?
│ │?
│ │?
│ │?
│ │?
│ │?
│ │?
│ │?
│─────────Message─────────────── │?
│ │?
│ │?
└────────────────────────────┘?
F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu?
───────────────────────────────?
其中頂上一行為Turbo C 2.0 主菜單, 中間窗口為編輯區(qū), 接下來是信息窗?
口, 最底下一行為參考行。這四個(gè)窗口構(gòu)成了Turbo C 2.0的主屏幕, 以后的編程、?
編譯、調(diào)試以及運(yùn)行都將在這個(gè)主屏幕中進(jìn)行。下面詳細(xì)介紹主菜單的內(nèi)容。?
1 主菜單?
主菜單 在Turbo C 2.0主屏幕頂上一行, 顯示下列內(nèi)容:?
File Edit Run Compile Project Options Debug Break/watch?
除Edit外, 其它各項(xiàng)均有子菜單, 只要用Alt加上某項(xiàng)中第一個(gè)字母(即大寫字?
母), 就可進(jìn)入該項(xiàng)的子菜單中。?
(1)、File(文件)菜單?
按Alt+F可進(jìn)入File菜單, 該菜單包括以下內(nèi)容:?
.Load(加載)?
裝入一個(gè)文件, 可用類似DOS的通配符(如*.C)來進(jìn)行列表選擇。也可裝入其它?
擴(kuò)展名的文件, 只要給出文件名(或只給路徑)即可。該項(xiàng)的熱鍵為F3, 即只要在主?
菜單中按F3即可進(jìn)入該項(xiàng), 而不需要先進(jìn)入File菜單再選此項(xiàng)。?
.Pick(選擇)?
將最近裝入編輯窗口的8個(gè)文件列成一個(gè)表讓用戶選擇, 選擇后將該程序裝入?
編輯區(qū), 并將光標(biāo)置在上次修改過的地方。其熱健為Alt-F3。?
.New(新文件)?
說明文件是新的, 缺省文件名為NONAME.C, 存盤時(shí)可改名。?
.Save(存盤)?
將編輯區(qū)中的文件存盤, 若文件名是NONAME.C時(shí), 將詢問是否更改文件名, 其?
熱鍵為F2。?
.Write to(存盤)?
可由用戶給出文件名將編輯區(qū)中的文件存盤, 若該文件已存在, 則詢問要不要?
覆蓋。?
.Directory(目錄)?
顯示目錄及目錄中的文件, 并可由用戶選擇。?
.Change dir(改變目錄)?
顯示當(dāng)前目錄, 用戶可以改變顯示的目錄。?
.Os shell(暫時(shí)退出)?
暫時(shí)退出Turbo C 2.0到DOS提示符下, 此時(shí)可以運(yùn)行DOS 命令, 若想回到?
Turbo C 2.0中, 只要在DOS狀態(tài)下鍵入EXIT即可。?
.Quit(退出)?
退出Turbo C 2.0, 返回到DOS操作系統(tǒng)中, 其熱鍵為Alt+X。?
說明:?
以上各項(xiàng)可用光標(biāo)鍵移動(dòng)色棒進(jìn)行選擇, 回車則執(zhí)行。也可用每一項(xiàng)的第一個(gè)?
大寫字母直接選擇。若要退到主菜單或從它的下一級(jí)菜單列表框退回均可用Esc鍵,?
Turbo C 2.0所有菜單均采用這種方法進(jìn)行操作, 以下不再說明。?
(2)、Edit(編輯)菜單?
按Alt+E可進(jìn)入編輯菜單, 若再回車, 則光標(biāo)出現(xiàn)在編輯窗口, 此時(shí)用戶可以?
進(jìn)行文本編輯。?
編輯方法基本與wordstar相同, 可用F1鍵獲得有關(guān)編輯方法的幫助信息。?
與編輯有關(guān)的功能鍵如下:?
F1 獲得Turbo C 2.0編輯命令的幫助信息?
F5 擴(kuò)大編輯窗口到整個(gè)屏幕?
F6 在編輯窗口與信息窗口之間進(jìn)行切換?
F10 從編輯窗口轉(zhuǎn)到主菜單?
編輯命令簡(jiǎn)介:?
PageUp 向前翻頁?
PageDn 向后翻頁?
Home 將光標(biāo)移到所在行的開始?
End 將光標(biāo)移到所在行的結(jié)尾?
Ctrl+Y 刪除光標(biāo)所在的一行?
Ctrl+T 刪除光標(biāo)所在處的一個(gè)詞?
Ctrl+KB 設(shè)置塊開始?
Ctrl+KK 設(shè)置塊結(jié)尾?
Ctrl+KV 塊移動(dòng)?
Ctrl+KC 塊拷貝?
Ctrl+KY 塊刪除?
Ctrl+KR 讀文件?
Ctrl+KW 存文件?
Ctrl+KP 塊文件打印?
Ctrl+F1 如果光標(biāo)所在處為Turbo C 2.0庫函數(shù), 則獲得有關(guān)該函數(shù)的幫助?
信息?
Ctrl+Q[ 查找Turbo C 2.0雙界符的后匹配符?
Ctrl+Q] 查找Turbo C 2.0雙界符的前匹配符?
說明:?
a. Turbo C 2.0的雙界符包括以下幾種符號(hào):?
花括符 {和}?
尖括符 <和>?
圓括符 (和)?
方括符 [和]?
注釋符 /*和*/?
雙引號(hào) "?
單引號(hào) '?
b. Turbo C 2.0在編輯文件時(shí)還有一種功能, 就是能夠自動(dòng)縮進(jìn), 即光標(biāo)定位?
和上一個(gè)非空字符對(duì)齊。在編輯窗口中, Ctrl+OL為自動(dòng)縮進(jìn)開關(guān)的控制鍵。?
(3)Run(運(yùn)行)菜單?
按Alt+R可進(jìn)入Run菜單, 該菜單有以下各項(xiàng):?
.Run(運(yùn)行程序)?
運(yùn)行由Project/Project name項(xiàng)指定的文件名或當(dāng)前編輯區(qū)的文件。如果對(duì)上?
次編譯后的源代碼未做過修改, 則直接運(yùn)行到下一個(gè)斷點(diǎn)(沒有斷點(diǎn)則運(yùn)行到結(jié)束)。?
否則先進(jìn)行編譯、連接后才運(yùn)行, 其熱鍵為Ctrl+F9。?
.Program reset(程序重啟)?
中止當(dāng)前的調(diào)試, 釋放分給程序的空間, 其熱鍵為Ctrl+F2。?
.Go to cursor(運(yùn)行到光標(biāo)處)?
調(diào)試程序時(shí)使用, 選擇該項(xiàng)可使程序運(yùn)行到光標(biāo)所在行。光標(biāo)所在行必須為一?
條可執(zhí)行語句, 否則提示錯(cuò)誤。其熱鍵為F4。?
.Trace into(跟蹤進(jìn)入)?
在執(zhí)行一條調(diào)用其它用戶定義的子函數(shù)時(shí), 若用Trace into項(xiàng), 則執(zhí)行長(zhǎng)條將?
跟蹤到該子函數(shù)內(nèi)部去執(zhí)行, 其熱鍵為F7。?
.Step over(單步執(zhí)行)?
執(zhí)行當(dāng)前函數(shù)的下一條語句, 即使用戶函數(shù)調(diào)用, 執(zhí)行長(zhǎng)條也不會(huì)跟蹤進(jìn)函數(shù)?
內(nèi)部, 其熱鍵為F8。?
.User screen(用戶屏幕)?
顯示程序運(yùn)行時(shí)在屏幕上顯示的結(jié)果。其熱鍵為Alt+F5。?
(4)、Compile(編譯)菜單?
按Alt+C可進(jìn)入Compile菜單, 該菜單有以下幾個(gè)內(nèi)容:?
.Compile to OBJ(編譯生成目標(biāo)碼)?
將一個(gè)C源文件編譯生成.OBJ目標(biāo)文件, 同時(shí)顯示生成的文件名。其熱鍵為?
Alt+F9。?
.Make EXE file(生成執(zhí)行文件)?
此命令生成一個(gè).EXE的文件, 并顯示生成的.EXE文件名。其中.EXE文件名是下?
面幾項(xiàng)之一。?
a. 由Project/Project name說明的項(xiàng)目文件名。?
b. 若沒有項(xiàng)目文件名, 則由Primary C file說明的源文件。?
c. 若以上兩項(xiàng)都沒有文件名, 則為當(dāng)前窗口的文件名。?
.Link EXE file(連接生成執(zhí)行文件)?
把當(dāng)前.OBJ文件及庫文件連接在一起生成.EXE文件。?
.Build all(建立所有文件)?
重新編譯項(xiàng)目里的所有文件, 并進(jìn)行裝配生成.EXE文件。該命令不作過時(shí)檢查?
(上面的幾條命令要作過時(shí)檢查, 即如果目前項(xiàng)目里源文件的日期和時(shí)間與目標(biāo)文?
件相同或更早, 則拒絕對(duì)源文件進(jìn)行編譯)。?
.Primary C file(主C文件)?
當(dāng)在該項(xiàng)中指定了主文件后, 在以后的編譯中, 如沒有項(xiàng)目文件名則編譯此項(xiàng)?
中規(guī)定的主C文件, 如果編譯中有錯(cuò)誤, 則將此文件調(diào)入編輯窗口, 不管目前窗口?
中是不是主C文件。?
.Get info(獲得有關(guān)當(dāng)前路徑、源文件名、源文件字節(jié)大小、編譯中的錯(cuò)誤數(shù)?
目、可用空間等信息。?
(5)、Project(項(xiàng)目)菜單?
按Alt+P可進(jìn)入Project菜單, 該菜單包括以下內(nèi)容:?
.Project name(項(xiàng)目名)?
項(xiàng)目名具有.PRJ的擴(kuò)展名, 其中包括將要編譯、連接的文件名。例如有一個(gè)程?
序由file1.c, file2.c, file3.c組成, 要將這3個(gè)文件編譯裝配成一個(gè)file.exe的?
執(zhí)行文件, 可以先建立一個(gè)file.prj的項(xiàng)目文件, 其內(nèi)容如下:?
file1.c?
file2.c?
file3.c?
此時(shí)將file.prj放入Project name項(xiàng)中, 以后進(jìn)行編譯時(shí)將自動(dòng)對(duì)項(xiàng)目文件中?
規(guī)定的三個(gè)源文件分別進(jìn)行編譯。然后連接成file.exe文件。?
如果其中有些文件已經(jīng)編譯成.OBJ文件, 而又沒有修改過, 可直接寫上.OBJ擴(kuò)?
展名。此時(shí)將不再編譯而只進(jìn)行連接。?
例如: file1.obj?
file2.c?
file3.c?
將不對(duì)file1.c進(jìn)行編譯, 而直接連接。?
說明:?
當(dāng)項(xiàng)目文件中的每個(gè)文件無擴(kuò)展名時(shí), 均按源文件對(duì)待, 另外, 其中的文件也?
可以是庫文件, 但必須寫上擴(kuò)展名.LIB。?
.Break make on(中止編譯)?
由用戶選擇是否在有Warining(警告)、Errors(錯(cuò)誤)、Fatal Errors( 致命錯(cuò)?
誤)時(shí)或Link(連接)之前退出Make編譯。?
.Auto dependencies(自動(dòng)依賴)?
當(dāng)開關(guān)置為on, 編譯時(shí)將檢查源文件與對(duì)應(yīng)的.OBJ文件日期和時(shí)間, 否則不進(jìn)?
行檢查。?
.Clear project(清除項(xiàng)目文件)?
清除Project/Project name中的項(xiàng)目文件名。?
.Remove messages(刪除信息)?
把錯(cuò)誤信息從信息窗口中清除掉。?
(6)、Options(選擇菜單)?
按Alt+O可進(jìn)入Options菜單, 該菜單對(duì)初學(xué)者來說要謹(jǐn)慎使用。?
.Compiler(編譯器)?
本項(xiàng)選擇又有許多子菜單, 可以讓用戶選擇硬件配置、存儲(chǔ)模型、調(diào)試技術(shù)、?
代碼優(yōu)化、對(duì)話信息控制和宏定義。這些子菜單如下:?
Model?
共有Tiny, small, medium, compact, large, huge 六種不同模式可由同戶選?
擇。?
Define?
打開一個(gè)宏定義框, 同戶可輸入宏定義。多重定義可同分號(hào), 賦值可用等號(hào)。?
Code generation?
它又有許多任選項(xiàng), 這些任選項(xiàng)告訴編譯器產(chǎn)生什么樣的目標(biāo)代碼。?
Calling convention 可選擇C或Pascal方式傳遞參數(shù)。?
Instruction set 可選擇8088/8086或80186/80286指令系列。?
Floating point 可選擇仿真浮點(diǎn)、數(shù)學(xué)協(xié)處理器浮點(diǎn)或無浮點(diǎn)運(yùn)算。?
Default char type 規(guī)定char的類型。?
Alignonent 規(guī)定地址對(duì)準(zhǔn)原則。?
Merge duplicate strings 作優(yōu)化用, 將重復(fù)的字符串合并在一起。?
Standard stack frame 產(chǎn)生一個(gè)標(biāo)準(zhǔn)的棧結(jié)構(gòu)。?
Test stack overflow 產(chǎn)生一段程序運(yùn)行時(shí)檢測(cè)堆棧溢出的代碼。?
Line number 在.OBJ文件中放進(jìn)行號(hào)以供調(diào)試時(shí)用。?
OBJ debug information 在.OBJ文件中產(chǎn)生調(diào)試信息。?
Optimization?
Optimize for 選擇是對(duì)程序小型化還是對(duì)程序速度進(jìn)行優(yōu)?
化處理。?
Use register variable 用來選擇是否允許使用寄存器變量。?
Register optimization 盡可能使用寄存器變量以減少過多的取數(shù)操?
作。?
Jump optimization 通過去除多余的跳轉(zhuǎn)和調(diào)整循環(huán)與開關(guān)語句?
的辦法, 壓縮代碼。?
Source?
Indentifier length 說明標(biāo)識(shí)符有效字符的個(gè)數(shù), 默認(rèn)為32個(gè)。?
Nested comments 是否允許嵌套注釋。?
ANSI keywords only 是只允許ANSI關(guān)鍵字還是也允許Turbo C?
2.0關(guān)鍵字?
Error?
Error stop after 多少個(gè)錯(cuò)誤時(shí)停止編譯, 默認(rèn)為25個(gè)。?
Warning stop after 多少個(gè)警告錯(cuò)誤時(shí)停止編譯, 默認(rèn)為100個(gè)。?
Display warning?
Portability warning 移植性警告錯(cuò)誤。?
ANSI Violations 侵犯了ANSI關(guān)鍵字的警告錯(cuò)誤。?
Common error 常見的警告錯(cuò)誤。?
Less common error 少見的警告錯(cuò)誤。?
Names 用于改變段(segment)、 組( group) 和類?
(class)的名字, 默認(rèn)值為CODE,DATA,BSS。?
.Linker(連接器)?
本菜單設(shè)置有關(guān)連接的選擇項(xiàng), 它有以下內(nèi)容:?
Map file menu 選擇是否產(chǎn)生.MAP文件。?
Initialize segments 是否在連接時(shí)初始化沒有初始化的段。?
Devault libraries 是否在連接其它編譯程序產(chǎn)生的目標(biāo)文件時(shí)去尋?
找其缺省庫。?
Graphics library 是否連接graphics庫中的函數(shù)。?
Warn duplicate symbols 當(dāng)有重復(fù)符號(hào)時(shí)產(chǎn)生警告信息。?
Stack warinig 是否讓連接程序產(chǎn)生No stack的警告信息。?
Case-sensitive link 是否區(qū)分大、小寫字。?
.Environment(環(huán)境)?
本菜單規(guī)定是否對(duì)某些文件自動(dòng)存盤及制表鍵和屏幕大小的設(shè)置?
Message tracking?
Current file 跟蹤在編輯窗口中的文件錯(cuò)誤。?
All files 跟蹤所有文件錯(cuò)誤。?
Off 不跟蹤。?
Keep message 編譯前是否清除Message窗口中的信息。?
Config auto save 選on時(shí), 在Run, Shell或退出集成開發(fā)環(huán)境之前,?
如果Turbo C 2.0的配置被改過, 則所做的改動(dòng)?
將存入配置文件中。選off時(shí)不存。?
Edit auto save 是否在Run或Shell之前, 自動(dòng)存儲(chǔ)編輯的源文件。?
Backup file 是否在源文件存盤時(shí)產(chǎn)生后備文件(.BAK文件)。?
Tab size 設(shè)置制表鍵大小, 默認(rèn)為8。?
Zoomed windows 將現(xiàn)行活動(dòng)窗口放大到整個(gè)屏幕, 其熱鍵為F5。?
Screen size 設(shè)置屏幕文本大小。?
.Directories(路徑)?
規(guī)定編譯、連接所需文件的路徑, 有下列各項(xiàng):?
Include directories 包含文件的路徑, 多個(gè)子目錄用";"分開。?
Library directories 庫文件路徑, 多個(gè)子目錄用";"分開。?
Output directoried 輸出文件(.OBJ, .EXE, .MAP文件)的目錄。?
Turbo C directoried Turbo C 所在的目錄。?
Pick file name 定義加載的pick文件名, 如不定義則從current?
pick file中取。?
.Arguments(命令行參數(shù))?
允許用戶使用命令行參數(shù)。?
.Save options(存儲(chǔ)配置)?
保存所有選擇的編譯、連接、調(diào)試和項(xiàng)目到配置文件中, 缺省的配置文件為?
TCCONFIG.TC。?
.Retrive options?
裝入一個(gè)配置文件到TC中, TC將使用該文件的選擇項(xiàng)。?
(7)、Debug(調(diào)試)菜單?
按Alt+D可選擇Debug菜單, 該菜單主要用于查錯(cuò), 它包括以下內(nèi)容:?
Evaluate?
Expression 要計(jì)算結(jié)果的表達(dá)式。?
Result 顯示表達(dá)式的計(jì)算結(jié)果。?
New value 賦給新值。?
Call stack 該項(xiàng)不可接觸。而在Turbo C debuger 時(shí)用于檢?
查堆棧情況。?
Find function 在運(yùn)行Turbo C debugger時(shí)用于顯示規(guī)定的函數(shù)。?
Refresh display 如果編輯窗口偶然被用戶窗口重寫了可用此恢復(fù)?
編輯窗口的內(nèi)容。?
(8)、Break/watch(斷點(diǎn)及監(jiān)視表達(dá)式)?
按Alt+B可進(jìn)入Break/watch菜單, 該菜單有以下內(nèi)容:?
Add watch 向監(jiān)視窗口插入一監(jiān)視表達(dá)式。?
Delete watch 從監(jiān)視窗口中刪除當(dāng)前的監(jiān)視表達(dá)式。?
Edit watch 在監(jiān)視窗口中編輯一個(gè)監(jiān)視表達(dá)式。?
Remove all watches 從監(jiān)視窗口中刪除所有的監(jiān)視表達(dá)式。?
Toggle breakpoint 對(duì)光標(biāo)所在的行設(shè)置或清除斷點(diǎn)。?
Clear all breakpoints 清除所有斷點(diǎn)。?
View next breakpoint 將光標(biāo)移動(dòng)到下一個(gè)斷點(diǎn)處。?
六 Turbo C 2.0的配置文件?
所謂配置文件是包含Turbo C 2.0有關(guān)信息的文件, 其中存有編譯、連接的選?
擇和路徑等信息。?
可以用下述方法建立Turbo C 2.0的配置:?
1. 建立用戶自命名的配置文件?
可以從Options菜單中選擇Options/Save options命令, 將當(dāng)前集成開發(fā)環(huán)境?
的所有配置存入一個(gè)由用戶命名的配置文件中。下次啟動(dòng)TC時(shí)只要在DOS下鍵入:?
tc/c<用戶命名的配置文件名>?
就會(huì)按這個(gè)配置文件中的內(nèi)容作為Turbo C 2.0的選擇。?
2. 若設(shè)置Options/Environment/Config auto save 為on, 則退出集成開發(fā)環(huán)?
境時(shí), 當(dāng)前的設(shè)置會(huì)自動(dòng)存放到Turbo C 2.0配置文件TCCONFIG.TC中。Turbo C 在?
啟動(dòng)時(shí)會(huì)自動(dòng)尋找這個(gè)配置文件。?
3. 用TCINST設(shè)置Turbo C的有關(guān)配置, 并將結(jié)果存入TC.EXE中。Turbo C 在啟?
動(dòng)時(shí), 若沒有找到配置文件, 則取TC.EXE中的缺省值。
========
關(guān)于tcc、tlink的編譯鏈接機(jī)制的研究
http://www.mamicode.com/info-detail-505191.html1、學(xué)習(xí)過程
在c:\下建立文件夾c,并將編譯器tcc.exe、連接器tlink.exe、相關(guān)文件c0s.obj、cs.lib、emu.lib、maths.lib放入文件夾中。
要搭建一個(gè)簡(jiǎn)單的C語言編譯環(huán)境,需要TC2.0、c0s.obj、emu.lib、maths.lib、graphics.lib、cs.lib文件。而這里用編譯器tcc.exe、連接器tlink.exe代替了TC2.0,而且相關(guān)文件也少了graphics.lib,為什么這樣也可以呢?我們先嘗試在新建立的環(huán)境下編譯連接一個(gè)文件:
用命令“tcc hello.c”編譯連接生成文件hello.obj和hello.exe:
運(yùn)行結(jié)果為:
在編譯連接過程中,第一次我用tcc hello.c編譯,發(fā)現(xiàn)只生成了hello.obj文件,然后我又用tlink hello.obj連接生成hello.exe文件,結(jié)果發(fā)現(xiàn)運(yùn)行這個(gè)exe文件會(huì)出錯(cuò)。經(jīng)過檢查后發(fā)現(xiàn),我把相關(guān)文件里的maths.lib錯(cuò)誤地復(fù)制成了mathl.lib,可能在連接文件時(shí)發(fā)生了錯(cuò)誤,導(dǎo)致exe文件出錯(cuò)。
那么這個(gè)環(huán)境與之前的環(huán)境相比,少了TC2.0、graphics.lib,多了tcc.exe、tlink.exe。在網(wǎng)上查閱資料發(fā)現(xiàn)graphics.lib是一個(gè)c語言圖形庫,TC2.0連接需要這個(gè)而tcc.exe不需要,我們可以理解為tc2.0在tcc.exe的基礎(chǔ)上多了這么一個(gè)擴(kuò)展,每一個(gè)庫文件都相當(dāng)于一個(gè)小模塊,支持一種擴(kuò)展。我們需要的時(shí)候,只需要添加相應(yīng)的庫文件就行了。
從功能上來看,tcc.exe只能從cmd編譯當(dāng)前目錄下已存在的文件,而TC2.0則支持文件的創(chuàng)建、修改、保存、編譯、連接,是集成了tcc.exe和tlink.exe的一個(gè)c語言小型開發(fā)平臺(tái)。
那么既然新建立的環(huán)境將所需要的相關(guān)文件減少到了4個(gè),那么是不是還可以減少呢?經(jīng)過實(shí)驗(yàn),我發(fā)現(xiàn)不論去掉哪一種相關(guān)文件,在編譯時(shí)都會(huì)出錯(cuò),生成一個(gè)錯(cuò)誤的hello.obj文件,并且cmd會(huì)有相似的提示:
所以我們可以斷定,在該環(huán)境下,4個(gè)相關(guān)文件必須都在才能保證編譯的成功。
補(bǔ)充研究:在網(wǎng)上查詢資料發(fā)現(xiàn),TC2.0是一個(gè)集成的開發(fā)環(huán)境,它集成了以下文件:
INSTALL.EXE 安裝程序文件
TC.EXE 集成編譯?
TCINST.EXE 集成開發(fā)環(huán)境的配置設(shè)置程序
TCHELP.TCH 幫助文件?
THELP.COM 讀取
TCHELP.TCH的駐留程序
README 關(guān)于Turbo C的信息文件?
TCCONFIG.EXE 配置文件轉(zhuǎn)換程序
MAKE.EXE 項(xiàng)目管理工具
TCC.EXE 命令行編譯
TLINK.EXE Turbo C系列連接器
TLIB.EXE Turbo C系列庫管理工具
C0?.OBJ 不同模式啟動(dòng)代碼
C?.LIB 不同模式運(yùn)行庫
GRAPHICS.LIB 圖形庫?
EMU.LIB 8087仿真庫
FP87.LIB 8087庫
*.H Turbo C頭文件
*.BGI 不同顯示器圖形驅(qū)動(dòng)程序?
*.C Turbo C例行程序(源文件)?
其中: 上面的?分別為:?
T Tiny(微型模式)?
S Small(小模式)?
C Compact(緊湊模式)?
M Medium(中型模式)?
L Large(大模式)?
H Huge(巨大模式)
這個(gè)在TC的安裝文件夾里其實(shí)也可以看出來:
?技術(shù)分享
但是我們之前的研究發(fā)現(xiàn)只需要需要TC2.0就可以成功編譯文件,而不需要tcc.exe也在目錄下,所以TC2.0是把tcc.exe集成在自己的文件內(nèi)部的,而不是對(duì)外部的編譯器進(jìn)行調(diào)用。
查看tcc.exe的功能:
可以看到tcc的命令格式是:tcc [選項(xiàng)] [文件名]
缺少正確的相關(guān)文件會(huì)對(duì)編譯造成怎樣的影響呢?我先用完整的相關(guān)文件進(jìn)行編譯,生成的exe文件有8kb,而刪去cs.lib后進(jìn)行編譯,發(fā)現(xiàn)生成的exe文件只有536字節(jié),比正確的文件要小得多,所以我認(rèn)為在用tlink進(jìn)行連接時(shí)因?yàn)橄嚓P(guān)文件的缺失導(dǎo)致有很大一部分相關(guān)文件都沒有連接進(jìn)來。
在網(wǎng)上查閱資料發(fā)現(xiàn)啟動(dòng)代碼有T Tiny(微型模式) 、S Small(小模式)、C Compact(緊湊模式) 、M Medium(中型模式) 、L Large(大模式) 、H Huge(巨大模式),那么分別對(duì)應(yīng)的相關(guān)文件應(yīng)該為:c0t.obj,ct.lib,c0s.obj,cs.lib...果然,我們?cè)赥C2.0的lib庫里發(fā)現(xiàn)了相關(guān)文件;
我發(fā)現(xiàn),其他的模式都有對(duì)應(yīng)的c0*.obj和c*.lib文件,而微型模式只有c0t.obj文件,這是為什么呢?是該模式的編譯特性決定他們只要用一個(gè)文件嗎?我們來試試是否可以編譯成功,將c0t.obj拷貝到c:\c文件夾下,再用tcc -mt hello.c編譯,發(fā)現(xiàn)可以編譯連接成功,生成的exe文件也能成功運(yùn)行,所以微型模式的編譯是不需要特定的lib文件,這說明微型模式在編譯時(shí)不需要向文件里面加入專門的庫函數(shù)。
要實(shí)現(xiàn)打印出子函數(shù)的段地址和偏移地址,首先要知道,子函數(shù)的段地址和偏移地址放在哪里。我們?cè)凇?0140426_綜合研究2研究報(bào)告》中發(fā)現(xiàn):(1)函數(shù)的名字就代表它的偏移地址。(2)函數(shù)的調(diào)用在匯編里是采用call-ret方法實(shí)現(xiàn)的。另外我們知道匯編中存儲(chǔ)當(dāng)前段地址的寄存器為CS寄存器。
首先填充main函數(shù),分別打印每一個(gè)函數(shù)的偏移地址,以及運(yùn)行函數(shù)后CS寄存器的值:
顯示結(jié)果為:
發(fā)現(xiàn)main函數(shù)的偏移地址為21b,f1的偏移地址為1fa,f2的偏移地址為205,f3的偏移地址為210,cs寄存器的一直為1a2.那么CS里的值真的是子函數(shù)的段地址的值嗎?我們用debug加載程序:
發(fā)現(xiàn)main()、f1()、f2()、f3()的偏移地址是對(duì)的。但是段地址應(yīng)為076a而不是打印出來的CS寄存器的值1a2。
如果用長(zhǎng)整形將main函數(shù)和f1的值全部打印出來:
則段地址還是1a2。但是用debug查看并不一樣。那么問題在哪里呢?
在網(wǎng)上查看,發(fā)現(xiàn)有一個(gè)相似問題的解釋是這樣的:“調(diào)試的情況下 是用調(diào)試器來實(shí)對(duì) 單步 斷點(diǎn)異常的處理。加載了更多的函數(shù)。 當(dāng)然地址會(huì)不一樣了?!?
我覺得可能是直接運(yùn)行和debug調(diào)試分配的內(nèi)存空間不一樣,如上所說,debug調(diào)試要加載更多的函數(shù),所以main函數(shù)的段地址會(huì)相對(duì)較大。
但是這里是子函數(shù)和main函數(shù)在一個(gè)段里,所以子函數(shù)的段地址可以在主函數(shù)里用_CS
表示,如果子函數(shù)和main函數(shù)不在一個(gè)段里呢?我們知道:用tcc hello.c生成的文件可有兩個(gè)段,一個(gè)為代碼段,一個(gè)為棧和數(shù)據(jù)段。所以子函數(shù)和主函數(shù)都要在同一個(gè)代碼段里。那么如果代碼量超過64kb,一個(gè)段存放不下,怎么辦?在網(wǎng)上查閱資料如下:
C 語言中提供了6種編譯模式,這6種模式是:
微模式(Tiny),小模式(Small),中模式(Medium),緊湊模式(Compact),大模式(Large)和巨模式(Huge)。它們之間的關(guān)系如下圖所示。用戶可以按照自己的程序大小及需要進(jìn)行選擇。
│ 小程序 │ 大程序
━━━━┿━━━━━━┿━━━━━━━━
小數(shù)據(jù) │ 微,小 │ 中
大數(shù)據(jù) │ 緊湊 │ 大,巨
所謂小程序就是指程序只有一個(gè)程序段,大小不超過64KB,缺省的碼(函數(shù))指針是near(近程指針)。所謂大程序就是指程序只有多個(gè)程序段,每個(gè)程序段不超過64KB,但總程序量可超過64KB,缺省的碼指針是far(遠(yuǎn)程指針)。小數(shù)據(jù)就是指數(shù)據(jù)只有一個(gè)數(shù)據(jù)段,缺省的數(shù)據(jù)指針是near。大數(shù)據(jù)就是指數(shù)據(jù)有多個(gè)數(shù)據(jù)段,缺省的數(shù)據(jù)指針是far。
由上可知,我們所說的只有一個(gè)代碼段的程序是小程序,它的代碼不超過64kb,在編譯時(shí)會(huì)以默認(rèn)的編譯模式:小模式來編譯。即前面研究里所說的tcc a.c生成的exe文件有一個(gè)代碼段,一個(gè)棧和數(shù)據(jù)段就可以理解了。我們用TC2.0的時(shí)候不可缺少的相關(guān)文件里有關(guān)編譯模式的是c0s.obj和cs.lib,所以TC2.0默認(rèn)的編譯模式是小模式。所以默認(rèn)的編譯只能編譯代碼量不超過64kb的文件。?
關(guān)于不同模式的區(qū)別,查詢資料如下:
C語言編譯模式—微模式(Tiny)
? ? 在微模式下程序中的數(shù)據(jù)及代碼均放在同一段內(nèi),即它們不超過 64KB。在微模式下代碼段、堆棧段和數(shù)據(jù)段的段地址均相同,即CS=DS=SS=ES。在微模式下,數(shù)據(jù)指針都是 near,一般小程序可采用此編譯模式進(jìn)行編譯。還可用 DOS 中的 EXE2BIN 轉(zhuǎn)換程序?qū)?EXE 程序轉(zhuǎn)換成.COM 程序。代碼段、數(shù)據(jù)段和堆棧段均在同一段內(nèi),對(duì)它們進(jìn)行尋址時(shí),均以同一地址偏移的參考點(diǎn),具有這種特點(diǎn)的段又稱為屬于同一組段(DGROUP),棧是向上生長(zhǎng)的,即每壓棧一次,棧指針SP減2,即向地址減少的方向移動(dòng),它開始的初始值指向棧底,即0xffff(64KB)。堆是向下生長(zhǎng)的,即向增加地址的方向改變。堆和棧地址相向生長(zhǎng),當(dāng)兩者未相遇時(shí),便出現(xiàn)了自由空間。一般程序均是這種狀態(tài),當(dāng)占用棧地址較多時(shí),兩者可能重合并覆蓋部分堆空間。
C語言編譯模式—小模式(Small)
在小模式下,程序中的代碼放在64KB的代碼段內(nèi),數(shù)據(jù)放在64KB的數(shù)據(jù)段內(nèi)。在小模式下,棧段、附加數(shù)據(jù)段和數(shù)據(jù)段均指向同一地址,它們合三為一,即DS=SS=ES,指針都是near,一般程序均采用小模式編譯。在小模式下,內(nèi)存分配如下圖所示。從圖中可以看出數(shù)據(jù)段、堆棧段和附加段為同一段組,即它們的偏移地址均以同一段地址為參考點(diǎn)。
C語言編譯模式—中模式(Medium)
在中模式下,所有數(shù)據(jù)放在64KB的數(shù)據(jù)段內(nèi),因而數(shù)據(jù)段內(nèi)使用near,代碼量可以大于64KB(允許達(dá)到1MB),因而可以在不同的代碼段內(nèi),代碼段使用(far遠(yuǎn)程指針)。這種編譯模式適用于大代碼量、小數(shù)據(jù)量的大程序。中模式下的內(nèi)存分配如下圖所示。
C語言編譯模式—緊湊模式(Compact)
在緊湊模式下,數(shù)據(jù)量超過64KB時(shí),可放在多個(gè)數(shù)據(jù)段中,數(shù)據(jù)段內(nèi)的指針是(far)。代碼量不超過64KB時(shí),可在一個(gè)段內(nèi),因而代碼段內(nèi)指針為近程的(near)。但在該模式下,靜態(tài)數(shù)據(jù)仍不能超過64KB,堆用far指針來存取。緊湊模式下的內(nèi)存結(jié)構(gòu)如下圖所示。
C語言編譯模式—大模式(Large)
大模式下,代碼及數(shù)據(jù)均采用far指針,且都可達(dá)到1MB。靜態(tài)數(shù)據(jù)仍跟緊湊模式一樣,不能超過64KB。大模式下的內(nèi)存結(jié)構(gòu)如下圖所示。
C語言編譯模式—巨模式(Huge)
巨模式下,代碼段及數(shù)據(jù)段均用far指針,代碼分布在不同的代碼段內(nèi),數(shù)據(jù)也分布在不同的數(shù)據(jù)段內(nèi),它們來自不同的源程序,大堆棧只有一個(gè)。而且靜態(tài)數(shù)據(jù)大小允許超過64KB。巨模式下的內(nèi)存結(jié)構(gòu)如下圖所示。
即不同模式的區(qū)別在于可編譯的代碼量和數(shù)據(jù)量不一樣。那么在編譯的時(shí)候?qū)τ诔^64kb的文件該如何選擇編譯模式呢?
無論采用哪一種編譯模式,C 源程序編譯生成的代碼和數(shù)據(jù)量都不能超過64KB,對(duì)于超過的源程序,可以視代碼或數(shù)據(jù)多少將其分解成兩個(gè)或多個(gè)程序分別編譯。大代碼量程序要選用大代碼編譯模式(中模式、大模式和巨模式),大數(shù)據(jù)量程序應(yīng)選用大數(shù)據(jù)編譯模式(緊湊模式、大模式和巨模式),這樣編譯生成的.obj 文件將會(huì)帶給連接程序信息,將代碼和數(shù)據(jù)安排在不同段內(nèi)。這樣生成的.exe 文件在加載時(shí)將告訴 DOS 該程序應(yīng)如何裝入代碼段和數(shù)據(jù)段,如何初始化寄存器。這樣,就可確定在不同編譯模式下開辟數(shù)據(jù)區(qū)的大小,即大于64KB,或不超過64KB。
?
2、解決的問題
? ?(1)TC2.0集成了tcc.exe、tlink.exe,并且包含了更多的功能。而tcc.exe、tlink.exe、c0s.obj、cs.lib、emu.lib、maths.lib是編譯c文件必不可少的文件。
(2)怎么打印所有函數(shù)的段地址和偏移地址?
答:可以用printf(“%lx”,(long)函數(shù)名);來打印,這樣段地址和偏移地址是連在一起的,也可以用printf(“%x ? ? %x”,_CS,函數(shù)名);來打印,這樣段地址和偏移地址是分開的。
? ?(3)為什么輸出的段地址和debug調(diào)試的段地址不一樣?
答:debug調(diào)試要加載更多的函數(shù),所以main函數(shù)的段地址會(huì)相對(duì)較大。
? ?(4)用tcc hello.c生成的文件可有兩個(gè)段,一個(gè)為代碼段,一個(gè)為棧和數(shù)據(jù)段。所以子函數(shù)和主函數(shù)都要在同一個(gè)代碼段里。那么如果代碼量超過64kb,一個(gè)段存放不下,怎么辦?
答:那應(yīng)該使用別的內(nèi)存編譯模式,TC下默認(rèn)的模式是小模式,只支持64kb以下的代碼和數(shù)據(jù),若代碼和數(shù)據(jù)超過64kb,可以使用大模式或者巨模式。
3、研討會(huì)解決的問題
? ?(1)如果缺少相關(guān)文件,tcc.exe會(huì)調(diào)用tlink.exe嗎?生成的obj文件是含有其他相關(guān)文件嗎?
答:根據(jù)討論,如果缺少相關(guān)文件,tcc.exe調(diào)用了tlink.exe但是無法找到文件,需要再用tlink.exe來連接obj文件,生成exe文件。如果缺少相關(guān)文件,tlink會(huì)連接其他相關(guān)文件。經(jīng)過實(shí)驗(yàn),如果缺少maths.lib,程序能夠輸出helloworld,而如果缺少c0s.obj或者cs.lib編譯成的exe文件就會(huì)運(yùn)行出錯(cuò),這是因?yàn)閙aths.lib是運(yùn)算相關(guān)的庫,如果程序里沒有運(yùn)算的話,即使缺少也不影響程序的執(zhí)行,而c0s.obj或者cs.lib是程序啟動(dòng)運(yùn)行所需要的文件,所以一旦缺少就會(huì)出錯(cuò)。
修改:經(jīng)過再次的實(shí)驗(yàn),我發(fā)現(xiàn)缺少maths.lib文件,編譯連接生成的exe文件也會(huì)顯示出錯(cuò),這說明之前的結(jié)論是不成立的。tcc.exe的功能是把c源文件編譯成二進(jìn)制obj文件,再調(diào)用tlink.exe進(jìn)行連接生成exe文件。即只要執(zhí)行一條命令就能把c源文件編譯連接成可執(zhí)行的exe文件。我們沒有改變tcc.exe文件的內(nèi)容,那么tcc還是會(huì)調(diào)用tlink,只是因?yàn)橄嚓P(guān)文件不全而出錯(cuò)導(dǎo)致tlink沒有正確執(zhí)行連接而已。實(shí)驗(yàn)發(fā)現(xiàn)先用tcc -c hello.c或者tcc -linclude hello.c將源文件編譯成obj文件,再連接成exe文件還是執(zhí)行出錯(cuò),在網(wǎng)上有資料說這樣編譯連接會(huì)導(dǎo)致返回錯(cuò)誤,但沒有說明具體原因。我覺得可能單獨(dú)用tlink連接hello.obj會(huì)在調(diào)用相關(guān)文件上出錯(cuò),就是說tlink沒有調(diào)用相關(guān)文件的能力,只是tcc調(diào)用它的時(shí)候告訴它應(yīng)該按什么順序來連接,它才能正常連接。但是這個(gè)猜想和上面的問題一樣,我暫時(shí)還找不到方法和資料來驗(yàn)證,希望學(xué)長(zhǎng)能在衍生課上講一講,具體的問題是這樣的:
如果缺少相關(guān)文件,生成的obj文件是含有其他相關(guān)文件嗎?為什么一定要tcc.exe調(diào)用tlink.exe才能生成正確的可執(zhí)行文件?
(2)為何在原來的平臺(tái)上即使沒有tcc和tlink也能夠編譯鏈接成功。
答:TC2.0集成有多種編譯器,c語言和匯編語言是可以混合編譯的。如果出現(xiàn)匯編語言,那么TC2.0就會(huì)調(diào)用tcc.exe來進(jìn)行編譯。Turbo c包有兩種編譯器,集成開發(fā)環(huán)境下的叫做TC.EXE和命令行方式的叫做TCC.EXE. 集成開發(fā)環(huán)境包括:集成編輯器、命令行編譯器、連接器、調(diào)試器。
(3)庫文件是怎么搜索的?
答:在turboc.CFG中可以指定tcc可以用來搜索的庫文件的位置。但是用TC2.0修改路徑不會(huì)保存在turboc.CFG中,而是生成另一個(gè)配置文件。
(4)三種模式,是否可以互相的替換
答:其實(shí)c語言編譯有6種模式,這6種模式編譯的結(jié)果都是一樣的,只是支持的數(shù)據(jù)大小和程序大小不一樣。
(5)為何打印出來的段地址的值和用debug調(diào)試的時(shí)候出來的地址的值是不一樣的?
答:編譯時(shí)給定了偏移地址,載入時(shí)cmd或者debug再給定段地址,所以段地址不一樣。
(6)假如代碼量超過了64K后,會(huì)如何?
答:那么就不能用默認(rèn)的內(nèi)存編譯模式(小模式)來編譯,會(huì)出錯(cuò)。應(yīng)該用支持大程序的模式來編譯(如中模式、大模式、巨模式)。編譯器會(huì)把代碼分成幾個(gè)不超過64kb的程序來編譯。
(7)為什么打印出來的偏移地址改變,在平常的時(shí)候main函數(shù)的偏移地址是1fa但是此時(shí)的main函數(shù)的偏移地址不是這樣的了?
答:主函數(shù)的偏移地址不一定是1fa,而是第一個(gè)程序的偏移地址是1fa。之后函數(shù)的偏移地址按程序的長(zhǎng)度發(fā)生變化。其實(shí)原理和匯編語言里不同段的地址不同是一樣的。C0s.Obj里的函數(shù)加載完后正好到了1fa處應(yīng)該加載源文件的內(nèi)容了,這時(shí)那個(gè)函數(shù)在第一個(gè)就把哪個(gè)函數(shù)放在1fa處。
(8)如何用一條語句打印出段地址和偏移地址。
答:可以用printf(“%lx”,main);打印出段地址和偏移地址。
4、學(xué)習(xí)感想
其實(shí)TC2.0也是別人寫的方便開發(fā)者使用的一個(gè)程序。它是調(diào)用了tcc.exe、tlink.exe和一些庫文件來實(shí)現(xiàn)程序的編譯連接,而更高級(jí)的開發(fā)工具只是編寫的功能更全、調(diào)用的文件更多、采用更高級(jí)的編譯器和連接器而已。它們都是由這一個(gè)小小的tcc.exe衍生開的。龐大的、復(fù)雜的事物,其實(shí)可能起核心作用的就是那么一點(diǎn)點(diǎn)東西而已。
========
Windows下用TCC編譯Lua源碼
http://demon.tw/software/compile-lua-with-tcc.html心血來潮研究了一下怎么用TCC源碼編譯Lua。
花了些時(shí)間閱讀TCC和Lua的幫助文檔,得到下面的批處理build-lua.bat:
@echo off
rem Author: Demon
rem Date: 2012/6/2
rem Website: http://demon.tw
set INSTALL_TOP=C:\Lua
set INSTALL_BIN=%INSTALL_TOP%\bin
set INSTALL_INC=%INSTALL_TOP%\include
set INSTALL_LIB=%INSTALL_TOP%\lib
if not exist %INSTALL_BIN% mkdir %INSTALL_BIN%
if not exist %INSTALL_INC% mkdir %INSTALL_INC%
if not exist %INSTALL_LIB% mkdir %INSTALL_LIB%
cd src
tcc -r -o liblua.a lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c
tcc -o lua.exe liblua.a lua.c
tcc -o luac.exe liblua.a luac.c
>nul copy lua.exe ?%INSTALL_BIN%
>nul copy luac.exe %INSTALL_BIN%
>nul copy liblua.a %INSTALL_LIB%
for %%i in (lua.h luaconf.h lualib.h lauxlib.h lua.hpp) do (
>nul copy %%i %INSTALL_INC%
)
%INSTALL_BIN%\lua.exe -i
將其保存到Lua源碼的根目錄,運(yùn)行即可。批處理水平不高,寫得不好的地方請(qǐng)不要見笑。
========
總結(jié)
以上是生活随笔為你收集整理的TC 2.0 学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java Ant 学习总结
- 下一篇: 软件漏洞分析技术