① 如何編譯ec文件
用ftp傳到伺服器上 用gcc
② 請用c語言編譯
預編譯,編譯生成匯編,匯編生成目標文件,目標文件連接庫文件生成可執行文件.
預編譯 gcc -E
編譯 gcc -S
匯編as
連接ld 這兩個需要安裝binutils rpm包
1,預編譯
編寫c源程序game.c
#include
int main()
{
printf("Hello World!\n");
}
gcc -E -o pregame game.c
file pregame
pregame: ASCII C program text
cat pregame
gcc -o game game.c 生成 可執行程序 game
gcc -o pregame pregame.c 生成可執行程序pregame
pregame最好用.c做為文件名
發現 game和pregame的運行結果一樣,這也說明了預編譯的作用.
總結一下預編譯的作用:(這些是lorne大人總結的,與我無關)
1. 把"include"的文件拷貝到要編譯的源文件中。
2. 用實際值替代"define"的文本。
3. 在調用宏的地方進行宏替換。
2.編譯。
gcc -S -o aspregame pregame.c
file aspregame
aspregame: ASCII assembler program text
cat aspregame
.file "pregame.c
.section .rodata
.LC0:
.string "Hello World!"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
movl $.LC0, (%esp)
call puts
addl $4, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.0 20060304 (Red Hat 4.1.0-3)"
.section .note.GNU-stack,"",@progbits
3.生成目標文件.
as -o ldaspregame aspregame
會生成ldaspregame文件
file ldaspregame
ldaspregame: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
4.連接成為可執行文件
gcc -o exldaspregame ldaspregame
③ C語言編譯成匯編的問題,一個while(i--)對應著18個匯編命令匯編幾乎一點不懂,請神人們詳細講講吧!
PIC 單片機 可以看看單片機數據手冊的指令系統 會有所了解的
07E7 2FEC GOTO 0x7ec ; 無條件轉移 -> 0x7ec
07EC 30FF MOVLW 0xff ; W寄存器 = 0xff
07ED 07F0 ADDWF 0x70, F ; W = W+(0x70) 0x70 為寄存器地址
07EE 1803 BTFSC 0x3, 0 ; 如果 (0x3.0)=0 則跳過下一條指令 0x3 的 0位
07EF 0AF1 INCF 0x71, F ; W = (0x71) = (0x71)+1
07F0 30FF MOVLW 0xff ; W寄存器 = 0xff
07F1 07F1 ADDWF 0x71, F ; W = W+(0x71)
07F2 30FF MOVLW 0xff ; W寄存器 = 0xff
07F3 0671 XORWF 0x71, W ; W = W 異或 (0x71)
07F4 1D03 BTFSS 0x3, 0x2 ; 如果 (0x3.2)=1 則跳過下一條指令
07F5 2FF8 GOTO 0x7f8 ; 轉移 -> 0x7f8
07F6 30FF MOVLW 0xff ; W寄存器 = 0xff
07F7 0670 XORWF 0x70, W ; W = W 異或 (0x70)
07F8 1D03 BTFSS 0x3, 0x2 ; 如果 (0x3.2)=1 則跳過下一條指令
07F9 2FFB GOTO 0x7fb ; 轉移 -> 0x7fb
07FA 2FFC GOTO 0x7fc ; 轉移 -> 0x7fc
07FB 2FE8 GOTO 0x7e8 ; 轉移 -> 0x7e8
07FC 2FFD GOTO 0x7fd ; 轉移 -> 0x7fd
④ C語言怎麼學
轉載
(一)語言入門:
《C++
Primer》
最新版本:第三版(第四版國外已上架,國內一些網上書店也在預訂中)
適合有豐富C經驗,缺乏C++經驗的。不過我個人一直認為此書帶著過於強烈的C語言的痕跡,對於C++的學習未必是好事。
《The
C++
Programming
Language》/《C++程序設計語言》
最新版本:第三版特別版
簡稱TC++PL,有其他語言的豐富經驗的。(也有人簡稱之為「TCPL」,但需與另一本《The
C
Programmer
Language》區分開來)
《Essential
C++》
《Accelerated
C++》
這兩本薄一些,都是不錯的選擇。《Accelerated
C++》本人沒有讀過,從各方面的評價來看,完全值得推薦。
以上幾本書都有相應的中文版,而且翻譯的質量都不錯。上面的書未必都需要讀一遍,但無論如何,TC++PL是應該閱讀的。
(二)進階A:
這個路線側重於語言本身
《Effective
C++》
最新版本:第二版(第三版國外已上架,國內一些網上書店也在預訂中)
簡稱EC。C++程序員必讀!很多時候,我們說C++聖經不是指TC++PL,而是這一本。《The
Pragmatic
Programmer》一書中寫到:「一旦你發現自己要參與C++項目的開發,趕快跑(不要走)到書店去購買Scott
Mayer的《Effective
C++》,可能還要《More
Effective
C++》」。
《C++
Coding
Standards:
101
Rules,
Guidelines,
and
Best
Practices》/《C++
編程規范》
個人認為此書應為C++程序員必備的案頭書。幾乎Effective系列和Exceptional系列都在這里得到了總結。最新的模版、異常的業界經驗都在這里的到了體現。可能的唯一缺陷就是對一個新手而言,關於「為什麼這么做」的問題,解釋的不夠。
我的看法是:如果你不理解其中的條款,記憶,並且照做;如果你理解其中的條款,我猜你一定會同意書中的觀點。我認為這本書中的內容至少在2009年以前都不會過時,人們將廣為傳誦它制定的101條戒律。
還不知道他的簡稱,也許「101」會成為一個候選者?
提到《Effective
C++》,那麼另外三本書一一浮出水面:
《More
Effective
C++》
《Exceptional
C++》
《More
Exceptional
C++》。
新書《Exceptional
C++
Style》也是值得一看的好書。
上述幾本書,一本也不應該放過。
個人建議上述書籍按順序閱讀。並且,在將來反復閱讀這幾本書。
(三)進階B:
這個路線側重於程序庫。
《The
C++
Standard
Library》/《C++標准程序庫—自修教程與參考手冊》
聽說過STL嗎?這本書會教你最基本的,也是最重要的STL的使用。這本書,應該是必讀的。
《Effective
STL》
會使用STL還不夠,還必須知道什麼時候選擇什麼STL組件,這是STL使用的必讀書。
《Generic
Programming
and
the
STL:
Using
and
Extending
the
C++
Standard
Template
Library》/《泛型編程與STL》。
這本書理論性較強,但是真的很嚴謹,而且並不是非常難懂。理解其中對於Concept的解釋,將是非常重要的。
《C++
STL》
這不是講述使用程序庫的,而是講述程序庫實現原理的。腸胃不好的,需要慢慢吸收。
這個路線的書,仍然是建議按順序閱讀。
進階A、進階B兩個路線應該是可以並行的。
其他進階參考書
提出這些參考書,只是避免爭議,也為開闊視野,筆者並不曾完全讀過所有的。
《Thinking
in
C++》/《C++編程思想》
這本書及其中文版傳言好壞都有,沒有認真看過,不做評價,如果確有興趣,不妨嘗試一下該書。
以下幾本書基本上涉及的都是語言本身,大體上可以按照以下的順序閱讀。
《C++必知必會》
如果早一年,這本書將是重量級的,然而它被101和《Exceptional
C++
Style》蓋過一頭。
《C++
Gotchas:
Avoiding
Common
Problems
in
Coding
and
Design》/《C++程序設計陷阱》
這又是一本我未曾讀過,而且廣受好評的書。
《STL
源碼剖析》
這本書我剛到手,就被人"借"走,以至於到現在也沒有看過。看過這本書的朋友,可以給一個合適的評價。
高級:
《The
Design
and
Evolution
of
C++》/《C++語方的設計和演化》
簡稱D&E,內容並不艱深,Bjarne的書,僅此,就值得一讀。
前段時間,互動網曾8塊一本(人民幣)賤賣此書,現在好像沒了。
《Inside
The
C++
Object
Model》/《深度探索C++對象模型》
C程序員讀後一定會覺得C++原來並不神秘。
《C++
Template》
在閱讀STL、Boost或者Loki的源代碼之前,請仔細閱讀本書,它可以減輕一些閱讀的煩惱。這本書是討論C++模版的權威。
《Modern
C++
Design
Generic
Programming
and
Design
Patterns
Applied》/《C++設計新思維——泛型編程與設計模式之應用》
簡稱MCD。在閱讀MCD之前,建議先閱讀一下《C++
Template》。
《對象揭秘:Java、Eiffel和C++》
你對C++不滿嗎?這本書可以部分地幫你完成抱怨的目標。也許它還可以讓你不迷信C++。
最後,一份C++標准文檔也是應該加以咀嚼的。
還有一些書籍,並不能簡單的歸於C++,也難以在純粹的書本學習中加以掌握。《Design
Patterns》/《設計模式》一書就歸於此類。
所有上述的書籍,要麼談論C++語言本身,要麼談論STL的,要麼兼而有之(當然嚴格講STL也是C++語言非常重要的一部分)。偶爾,某些書中條目也會涉及實際工程。這些書並不是C++軟體開發的全部,但是他們很重要。閱讀這些書,未必需要化費太多的精力,有時候是會困難,但也有時候會很快速。
最後,編程語言並非計算機科學技術的全部,尤其對於在校的學生來說,打好基礎、開闊視野都是非常重要的。
⑤ C文件如何成為可執行文件(編譯、鏈接、執行)——摘自《程序員的自我修養》
本文算是我閱讀《程序員的自我修養》(俞甲子等著)相關章節的筆記,文中直接引用了原書中的敘述,強烈建議大家去看原書,本文只做概要介紹而用。——註:文中有很多引用圖的地方,請大家自己去找原書看,支持正版!我遇到一個問題,Linux C編程中的問題:.. char *p; unsigned int i = 0xcccccccc; unsigned int j; p = (char *) &i; printf("%.2x %.2x %.2x %.2x\n", *p, p[1], p[2], p[3]); memcpy(&j, p, sizeof(unsigned int)); printf("%x\n", j); ... Output: ffffffcc ffffffcc ffffffcc ffffffcc 0xcccccccc My questions are: 1. Why it prints "ffffffcc ffffffcc ffffffcc ffffffcc"? (if p is unsigned char* then it will print correctly "cc cc cc cc") 2. Why pointer to char p copied to j correctly, why not every member in p overflow? since it is a signed char. 這是別人在郵件列表中提出的問題,在試圖回答這個問題的過程中,突然發現,自己對連接器的工作並不熟悉,因此拿來好書《程序員的自我修養》來看,並做如下匯報,強烈推薦《程序員的自我修養》!!!寫好的C語言文件,最終能夠執行,大致要經過預處理、編譯、匯編、鏈接、裝載五個過程。預編譯完成的工作: (1)將所有的"#define"刪除,並展開所有的宏定義 (2)處理所有條件預編譯指令 (3)處理#include預編譯指令,將被包含的文件插入到預編譯指令的位置,這個過程是遞歸進行的。 (4)刪除所有的注釋 (5)添加行號和文件名標識,以便調試 (6)保留所有的#pragma編譯器命令,因為編譯器需要使用它們。編譯完成的工作: (1)詞法分析 掃描源代碼序列,並將其分割為一系列的記號(Token)。 (2)語法分析 用語法分析器生成語法樹,確定運算符號的優先順序和含義、報告語法錯誤。 (3)語義分析 靜態語義分析包括生命和類型的匹配,類型的轉換;動態語義分析一般是在運行期出現的與語義相關性的問題,如除0錯。 (4)源代碼生成 源代碼級優化器在源代碼級別進行優化:如將如(6+2)之類的表達式,直接優化為(8)等等。將語法書轉換為中間代碼,如三地址碼、P-代碼等。 (5)代碼生成 將源代碼轉換為目標代碼,依賴於目標機器。 (6)目標代碼優化匯編完成的工作: 將匯編代碼變成機器可以執行的指令鏈接完成的工作: 鏈接完成的工作主要是將各個模塊之間相互引用的部分處理好,使得各個模塊之間正確銜接。鏈接過程包括:地址和空間分配、符號決議和重定位。 首先講靜態鏈接,基本的靜態鏈接如下: 我們可能在main函數中調用到定義在另一個文件中的函數foo(),但是由於每個模塊式單獨編譯的,因此main並不知道foo的地址,所以它暫時把這些調用foo的指令的目標地址擱置,等到最後鏈接的時候讓連接器去修正這些地址(重定位),這就是靜態鏈接最基本的過程和作用;對於定義在其他文件中的變數,也存在相同的問題。具體過程如下: (1)空間和地址分配 1)空間與地址分配:掃描所有輸入目標文件,獲得各個段的屬性、長度和位置,並且將目標文件中的符號表中所有的符號定義和符號引用收集起來,放到一個全局符號表中。 2)符號解析和重定位:使用第一步收集到的信息,讀取輸入文件中段的數據、重定位信息,並進行符號解析與重定位、調整代碼中的地址等。 動態鏈接的過程更為復雜,但是完成的工作類似。 動態鏈接的初衷是為了解決空間浪費和更新困難的問題,把鏈接過程推遲到運行時進行 首先介紹一個重要的概念——地址無關代碼。為了解決固定裝載地址沖突的問題,我們希望對所有絕對地址的引用不作重定位,而把這一步推遲到裝載的時候再完成,一旦模塊裝載地址確定,即目標地址確定,那麼系統對程序中所有的絕對地址引用進行重定位。同時我們希望,模塊中共享的指令部分在裝載時不需要因為裝載地址的改變而改變,所以把指令中那些需要被修改的部分分離出來,跟數據放在一起,這樣指令部分就可以保持不變,而數據部分可以在每個進程中擁有一個副本,這種方案目前被稱為地址無關代碼(PIC,Position-independent Code)。 我們需要解決如下四種引用中的重定位問題: 1)模塊內部調用或者跳轉:這個可以用相對地址調用或者基於寄存器的相對調用,所以不需要重定位2)模塊內部數據的訪問:用相對定址的方法,不過鏈接器實現得十分巧妙: call494 <__i686.get_pc_thunk.cx> add$0x188c, %ecx mov$0x1, 0x28(%ecx) //a=1 調用一個叫做__i686.get_pc_thunk.cx的函數,把call的下一條指令的地址放到ecx寄存器中,接著執行一條mov指令和一個add指令3)模塊間數據的訪問:在數據段里建立一個指向全局變數的指針數組,也成全局便宜表(GOT),當要引用全局變數時,可以通過GOT相對應的項間接引用: GOT是做到指令無關的重要的一環:在編譯時可以確定GOT相對於當前指令的偏移,根據變數地址在GOT中的偏移就可以得到變數的地址,當然GOT中哪個每個地址對應於哪個變數是由編譯器決定的。4)模塊間的調用、跳轉:採用上面類似的方法,不同的是GOT中相應的項存儲的是目標函數的地址,當模塊需要調用目標函數時,可以通過GOT中的項進行間接跳轉。 地址無關代碼小結: 現在,來看動態鏈接中的另一個重要問題——延遲綁定(PLT)。當函數第一次被用到時才進行綁定,否則不綁定。PLT為了實現延遲綁定,增加了一層間接跳轉。調用函數並不是通過GOT跳轉的,而是通過一個叫PLT項的結構進行跳轉的,每個外部函數在PLT中都有對應的項,如函數bar,其在PLT對應的項的地址記為bar@plt,實現方式如下: bar@plt: jmp* (bar@GOT) pushn pushmoleID jump_dl_runtime_resolve 鏈接器的這個實現至為巧妙: 如果在連接器初始化階段,已經正確的初始化了bar@GOT,那麼這個跳轉指令的結果正是我們所期望的,但是,為了實現PLT,一般在連接器初始化時,將"pushn"的地址放入到bar@GOT中,這樣就直接跳轉到第二條指令,相當於沒有進行任何操作。第二條指令「pushn」,n是bar這個符號引用在重定位表「.rel.plt」中的下標。接著將模塊的ID壓棧,跳轉到_dl_runtime_resolve完成符號解析和重定位工作,然後將bar的地址填入到bar@GOT中。下次再調用到bar時,則bar@GOT中存儲的是一個正確的地址,這樣就完成了整個過程。 在鏈接完成之後,就生成了你要的可執行文件了,如ELF文件,至於這個文件的詳細的信息,可以參考相關的文檔。 現在,你要運行你的可執行文件,這是如何做到的呢? 我們從操作系統的角度來看可執行文件的裝載過程。操作系統主要做如下三件事情:(1)創建一個獨立的虛擬地址空間,但由於採用了COW機制,這里只是復制了父進程的頁目錄和頁表,甚至不設置映射關系(參考操作系統相關書籍)。(2)讀取可執行文件頭,並且建立虛擬空間與可執行文件的映射關系。(3)將CPU的指令寄存器設置成可執行文件的入口地址,啟動運行。我們來看一下執行過程中,進程虛擬空間的分布。 首先我們來區分Section和Segment,都可以翻譯為「段」,那麼有什麼不同呢?從鏈接的角度來講,elf文件是按照Section存儲的,從裝載的角度講,elf文件是按照Segment存儲的。」Segment」實際上是從裝載的角度重新劃分了ELF的各個段,將其中屬性相似的Section合並為一個Segment,而系統是按照Segment來映射可執行文件的。
⑥ 編譯esal/c程序的makefile文件如何寫
你可以根據這樣的方法來編寫:
b074@gliethttp:~/work/gunzip$ cat Makefile
CC = gcc-4.1
LD = gcc-4.1
CFLAGS = -Wall -c -Dgliethttp -I.
LDFLAGS = -lpthread
SRCS = $(wildcard *.c)
OBJS = $(patsubst %c,%o,$(SRCS))
TARGET = gliethttp
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^
%o: %c
$(CC) $(CFLAGS) -o $@ $<
clean:
@rm -f *.o $(TARGET)
編譯當前Makefile所在目錄下的所有.c文件
執行
make
make clean
⑦ 易語言中可以把*.e的文件編譯成*.ec格式的文件嗎如果可以,要怎麼做
通常來說不可以 , 但是有一個特例。當*.e的代碼是模塊的時候,用易語言打開,靜態編譯出來就是*.ec了。這是因為易語言無論是編寫什麼保存的源代碼都是*.e,所以編寫模塊的時候保存的代碼也是*.e,這樣就能通過源代碼編譯出模塊(*.ec)
⑧ 易語言ec模塊的使用問題
.版本 2
.程序集 窗口程序集1
.子程序 _按鈕1_被單擊
刪除文件 (「C:\AA.exe」)
刪除文件用不到。ce模塊
而且你理解有誤
模塊的內容經過編譯後全部引用到程序中來的,並不是調用模塊里的內容。