版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 研究實(shí)驗(yàn)一 搭建一個(gè)精簡的C語言開發(fā)平臺(tái)一、 研究目的1 通過搭建C語言開發(fā)平臺(tái),認(rèn)識(shí)到匯編語言對(duì)于深入理解其他領(lǐng)域知識(shí)的重要性。2 對(duì)前面所學(xué)習(xí)的匯編知識(shí)進(jìn)行融合貫通。3 對(duì)用研究的方法進(jìn)行學(xué)習(xí)進(jìn)行體驗(yàn)4 培養(yǎng)自己獨(dú)立研究問題的能力。 二、 研究原理我們要搭建一個(gè)精簡的C語言開發(fā)平臺(tái),必須要對(duì)C語言開發(fā)環(huán)境有一個(gè)清晰的認(rèn)識(shí)了解。TC2.0軟件里有很多子文件和文件夾,而我們的目的是搭建一個(gè)精簡的C語言開發(fā)平臺(tái),顧名思義就是要找出我們編譯連接程序必須的文件,其他的文件就可以不要。我們可以在程序編譯連接中,根據(jù)出現(xiàn)的錯(cuò)誤,一步一步去把我們程序必須的文件夾找出來。三、 研究步驟和過程1. 安裝TC
2、2.0在D盤根目錄下,文件名為“TC2.0”。2. 在C盤根目錄下建立一個(gè)文件夾“minic”用來存放我們已知解決問題要有的程序和文件。在DOC環(huán)境下,輸入下面的指令:c:md minic3. 把TC.EXE文件拷貝到minc文件夾里,具體操作如下:在DOC中,minic目錄下輸入如下指令:Copy d:tc2.0tc.exe4. 打開TC2.0輸入程序,保存,其文件為“WO.C” 同時(shí)設(shè)置TC2.0的工作路徑,如下圖 設(shè)置后,保存好。5. 進(jìn)行編譯:編譯成功顯示: 生成文件WO.OBJ6. 連接: 出現(xiàn)錯(cuò)誤,顯示連接錯(cuò)誤:不能打開C0S.OBJ文件7. 查找C0S.OBJ文件,復(fù)制到文件夾m
3、inic 8. 按照步驟6和7的方法,連續(xù)找出缺失的必須文件,拷貝到minic文件夾,直到成功生成WO.EXE文件,完成后minic文件夾里有如下圖的文件: 四、 遇到的問題與總結(jié)1. 在把TC2.0中的內(nèi)容拷貝到minic文件時(shí),自己指令輸錯(cuò)了,后來通過多次試驗(yàn)終于成功了,至此發(fā)現(xiàn)自己對(duì)DOC的很多指令很不熟悉,今后還的加強(qiáng)在這方面的學(xué)習(xí)。2. 在找C0S.OBJ時(shí)把其中的“0”看成是字母o,導(dǎo)致一直找不到文件,疑惑了不久,后來去查找TC2.0文件夾,才發(fā)現(xiàn)其中的是數(shù)字0不是字母o.通過這個(gè)問題感覺自己還不細(xì)心,做程序最重要就是要非常細(xì)心,不能出一點(diǎn)擦錯(cuò)。 3. WO.EXE文件生成了,自己
4、去驗(yàn)證了下,發(fā)現(xiàn)在程序開始加一個(gè)“#include<>”就識(shí)別不了了。這個(gè)精簡的C語言開發(fā)平臺(tái)局限性很大。 4.自己研究了一下,tc里的路徑設(shè)置,tc保存路徑需要生成TCCONFIG.TC文件和TCPICK.TCP文件,這兩個(gè)文件默認(rèn)放在C旁的根目錄下。 研究實(shí)驗(yàn)二 使用寄存器一、 研究目的1 對(duì)前面所學(xué)習(xí)的匯編知識(shí)進(jìn)行融合貫通。2 對(duì)用研究的方法進(jìn)行學(xué)習(xí)進(jìn)行體驗(yàn)3 培養(yǎng)自己獨(dú)立研究問題的能力。 二、 研究步驟和思考1. 編寫一個(gè)程序yan2.c 編譯連接yan2.c,生成了yan2.exe文件,保存在minic中。2. 用Debug加載yan2,exe之后,用u命令查看其機(jī)器碼和
5、匯編代碼。 自己想了下沒找到對(duì)應(yīng)的機(jī)器碼。3. 找main函數(shù)在代碼段中的偏移地址。 在tc中輸入,然后編譯連接; 在DOS運(yùn)行他wo.exe,得到main的偏移地址是1fah 自己在別的程序中也打印了main的偏移地址,發(fā)現(xiàn)也是1fah。由此我得出一個(gè)結(jié)論:main的偏移地址是固定的。對(duì)于為什么能打印main的偏移地址,我認(rèn)為main就相當(dāng)于一個(gè)標(biāo)號(hào),但這個(gè)標(biāo)號(hào)在一定條件下是固定的,不能更改,我試了用別的字母代替main,編譯出錯(cuò)。4. 用debug查看1fah處得指令 和C程序一一對(duì)應(yīng)5. 驗(yàn)證:C語言將函數(shù)實(shí)現(xiàn)為匯編語言中的子程序編寫ur2.c,用DEBUG跟蹤。 Call 020b相當(dāng)
6、于調(diào)用f(void) 子程序返回,返回值放在了AX中為3。證明了 我們的設(shè)想是對(duì)的。三、 遇到的問題與總結(jié)。1. 第一次編寫yan2.c時(shí),我以為寄存器大小寫一樣可以,就把_AX寫成了_ax發(fā)現(xiàn)編譯錯(cuò)誤了,證明了我的假設(shè)是錯(cuò)誤的。2. 在用U查看yan2.exe的代碼時(shí),為什么代碼不是從main的偏移地址開始的,而開始的那端代碼是有什么作用類?,這里有個(gè)疑問,有待研究下面的試驗(yàn)。 研究實(shí)驗(yàn)三 使用內(nèi)存空間四、 研究目的1 深入理解在C語言中如何使用內(nèi)存空間。2 對(duì)用研究的方法進(jìn)行學(xué)習(xí)進(jìn)行體驗(yàn)3 培養(yǎng)自己獨(dú)立研究問題的能力。 五、 研究過程和思考總結(jié)1. 編寫程序um1.c,編譯連接 用DEBU
7、G察看,2. 用一條C語句實(shí)現(xiàn)在屏幕中間顯示一個(gè)綠色字符a第一次編寫了一下程序:可以顯示字符a,但顏色是白色,經(jīng)分析AH肯定沒送進(jìn)內(nèi)存空間中,后來經(jīng)過思考才發(fā)現(xiàn),char是字符型的 只占一個(gè)字節(jié),后來把程序改為:顯示一個(gè)綠色a,正確3. 編寫程序: 思考問題,通過一步一步在Debug 中察看,發(fā)現(xiàn)C語言將全局變量放在內(nèi)存中,將局部變量放在了棧中,push bp mov bp, sp 含義,為了還原現(xiàn)場。4. 研究函數(shù)的返回值存放位置:編程:把變量a,b分別賦值1,2 用debug察看,可以發(fā)現(xiàn):C語言將函數(shù)的返回值放在了ax中,在這里返回值為3 。5. 編程: 上面程序是向安全空間寫入從0到a
8、的8個(gè)字符,第一條指令是 宏定義,buffer后面()中的物理代替buffer, malloc(20)是向系統(tǒng)申請(qǐng)20個(gè)安全空間,while是循環(huán)指令。六、 體會(huì)與收獲通過做這個(gè)研究實(shí)驗(yàn),我更加深刻地理解了在C語言中如何使用內(nèi)存空間的。 研究實(shí)驗(yàn)四 不用main函數(shù)編程七、 研究目的1 對(duì)前面所學(xué)習(xí)的匯編知識(shí)進(jìn)行融合貫通。2 對(duì)用研究的方法進(jìn)行學(xué)習(xí)進(jìn)行體驗(yàn)3 培養(yǎng)自己獨(dú)立研究問題的能力。 八、 研究步驟和思考結(jié)果1. 編寫一個(gè)程序f.c 研究如何進(jìn)行編譯連接:編譯可以成功,連接出錯(cuò)。顯示錯(cuò)誤:這個(gè)錯(cuò)誤可能與C0S。obj有關(guān)系。2. 用link.exe對(duì)生成的obj文件進(jìn)行連接,生成exe文件
9、,用Debug 加載,觀察程序匯編代碼,思考: f.exe程序代碼有1dh個(gè)字節(jié);研究發(fā)現(xiàn)f.exe不能正常返回;f函數(shù)的偏移地址是0000h。3. 編程:m.c 編譯連接后用debug 加載開始: 結(jié)束: 思考總結(jié):m.exe總代碼是0ec8h字節(jié),m.exe可以正常返回,main函數(shù)和f函數(shù)指令一樣,4. 思考與結(jié)果: 用Debug對(duì)m.exe進(jìn)行跟蹤,找到對(duì)main函數(shù)進(jìn)行調(diào)用的指令的地址為011a, :整個(gè)程序的返回是下面第一個(gè)ret: 5. 研究main函數(shù)和c0s.obj的關(guān)系。研究步驟:1) 用link.exe對(duì)c:minic目錄下的c0s.obj進(jìn)行連接,生成c0s.exe2)
10、 用Debug查看cos.exe的匯編代碼和m.exe的匯編代碼,找到m.exe中的調(diào)用main函數(shù)的call指令的偏移地址,從這個(gè)偏移地址開始向后查看10條指令,然后用debug加載c0s.exe,從相同的偏移地址開始向后察看10條指令。對(duì)兩處得指令進(jìn)行比較。m.exe 的匯編代碼: C0s.exe的匯編代碼:結(jié)果分析和問題結(jié)果:比較兩處指令發(fā)現(xiàn)call 后面的地址發(fā)生了變化,也就是說調(diào)用的子程序的偏移地址不一樣。Tc.exe把c0s.obj同用戶.obj一起進(jìn)行連接,生成.exe文件。對(duì)main函數(shù)調(diào)用的指令和程序返回指令是c0s.obj提供的。我們用link.exe可以連接c0s.obj
11、來生成exe文件,然后用debug加載,這樣就可以查看c0s.obj文件中的程序代碼了。經(jīng)驗(yàn)證c0s.obj文件里有我們?cè)O(shè)想的代碼。6. 自己編寫一個(gè)程序c0s.asm,然后編譯為c0s.obj,替代c:minic目錄下的c0s.obj。如下: 用masm.exe編譯之后生成了文件c0s.obj,然后把其拷貝到c:minic目錄下,覆蓋掉原來的c0s.obj。7. 在c:minic目錄下,用tc.exe將f.c重新編譯,連接, 生成f.exe。 成功地生成了.exe文件。 然后用debug 查看。 上圖中 call 0012指令就是去執(zhí)行f.exe的代碼。8. 在新的c0s.obj的基礎(chǔ)上,寫
12、一個(gè)新的f.c,向安全的內(nèi)存空間寫入從“a”到“h”的8個(gè)字符。分析,理解f.c。程序f.c如下: 然后進(jìn)行編譯連接,成功生成了f.exe。 #define是宏定義,意思是把程序中的Buffer全部物理替換為(char *)*(int far *)0x02000000),(char *)*(int far *)0x02000000)表示 地址為0x02000000處的內(nèi)存中的內(nèi)容, Buffer = 0; ;將地址為0x02000000的內(nèi)存中的內(nèi)容修改為0. Buffe
13、r10 = 0;把0賦值給ds:0+10,字節(jié)操作。下面 while是一個(gè)循環(huán)語句:循環(huán)條件是:Buffer10不等于8。 語句主體是:把a(bǔ)到h的8個(gè)字符依次放到,0,1,7里。九、 收獲與感受做完這個(gè)研究試驗(yàn),我明白了在前幾個(gè)試驗(yàn)中,如果沒有main函數(shù)為什么不就不能生成exe文件,是因?yàn)門C中的c0s.obj需要和main函數(shù)一起連接,現(xiàn)在自己可以不用main函數(shù),也可以編寫C程序了,還學(xué)會(huì)了怎么自己編寫c0s.obj文件。 研究實(shí)驗(yàn)五 函數(shù)如何接受不定數(shù)量的參數(shù)十、 研究目的1 對(duì)前面所學(xué)習(xí)的匯編知識(shí)進(jìn)行融合貫通。2 對(duì)用研究的方法進(jìn)行學(xué)習(xí)進(jìn)行體驗(yàn)3 培養(yǎng)自己獨(dú)立研究
14、問題的能力。 十一、 研究步驟和思考結(jié)果1. 用c:minic下的tc.exe完成下面的試驗(yàn),寫一個(gè)程序a.c: 編譯連接生成了exe文件,用debug查看,分析a.exe的匯編代碼,思考問題:main函數(shù)是如何給showchar傳遞參數(shù)的?showchar是如何接受參數(shù)的?從上圖可以看出:main函數(shù)通過棧給shorchar傳遞參數(shù)。然后showchar就從棧里去取參數(shù)。2. 寫一個(gè)程序b.c: 編譯連接,用DEBUG察看b.exe的代碼,思考問題總結(jié): showchar 函數(shù)把n中存的數(shù)作為顯示字符的個(gè)數(shù),當(dāng)a=8時(shí)就結(jié)束輸出。在程序中showchar的第一個(gè)參數(shù)的偏移地址是_BP+4,
15、Printf函數(shù)是通過計(jì)數(shù)%c和%d的個(gè)數(shù),知道參數(shù)個(gè)數(shù)的。3. 實(shí)現(xiàn)一個(gè)簡單的printf函數(shù),只需要支持“%c,%d”即可。程序如下: void show(char * str,.);main() show("%c + %d= %c",'d',203,'f'); printf("%c + %d= %c",'d',203,'f'); void show(char * str,.) int xianshi=160*20+6; char yu; int jishu=0; char ch; in
16、t i; char *p; int c; int a=0;int b=0; while(*str!=0) if(*str='%') str+; if(*str='c') *(char far *)(0xb8000000+xianshi+a+a)=*(int *)(_BP+6+b+b); a+ ; b+; if(*str='d') c=*(int *)(_BP+6+b+b); if(c=0) *(char far *)(0xb8000000+xianshi+a+a)=0x30; a+; while(c!=0) yu=c%10;c=c/10; *p+=yu;jishu+; for(;jishu>0;jishu-) *(char far *)(0xb8000000+xianshi+a+a)=*(p-1)+0x30; a+;*p-; b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 法律行業(yè)客服工作總結(jié)專業(yè)解決法律問題
- 環(huán)保設(shè)備行業(yè)采購工作總結(jié)
- 音樂行業(yè)安全生產(chǎn)工作總結(jié)
- 分析行業(yè)數(shù)據(jù)解讀培訓(xùn)總結(jié)
- 咨詢行業(yè)中戰(zhàn)略顧問的工作表現(xiàn)概述
- 【八年級(jí)下冊(cè)歷史】第6課 艱難探索與建設(shè)成就 同步練習(xí)
- 創(chuàng)新實(shí)驗(yàn)資源共享合同(2篇)
- 2024社團(tuán)規(guī)章制度(30篇)
- 《政府采購業(yè)務(wù)知識(shí)》課件
- 2024年福建省《輔警招聘考試必刷500題》考試題庫帶答案(突破訓(xùn)練)
- 【8物(科)期末】合肥市廬陽區(qū)2023-2024學(xué)年八年級(jí)上學(xué)期期末質(zhì)量檢測(cè)物理試卷
- 國家安全知識(shí)教育
- 2024-2030年中國停車場建設(shè)行業(yè)發(fā)展趨勢(shì)投資策略研究報(bào)告
- 藍(lán)軍戰(zhàn)略課件
- 物業(yè)管理重難點(diǎn)分析及解決措施
- 北京郵電大學(xué)《數(shù)據(jù)庫系統(tǒng)》2022-2023學(xué)年第一學(xué)期期末試卷
- 湖北省黃岡市2023-2024學(xué)年高一上學(xué)期期末考試化學(xué)試題(含答案)
- 中國HDMI高清線行業(yè)市場動(dòng)態(tài)分析及未來趨勢(shì)研判報(bào)告
- 物流公司安全生產(chǎn)監(jiān)督檢查管理制度
- DB22T 277-2011 建筑電氣防火檢驗(yàn)規(guī)程
- 2024年基本公共衛(wèi)生服務(wù)工作計(jì)劃(三篇)
評(píng)論
0/150
提交評(píng)論