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