江佳-第二次研討會報告v20_第1頁
江佳-第二次研討會報告v20_第2頁
江佳-第二次研討會報告v20_第3頁
江佳-第二次研討會報告v20_第4頁
江佳-第二次研討會報告v20_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 第二次研討會報告對c0s.obj進行修改,使得程序的入口函數不是mian函數,而是hnlg函數。找到main如下將main修改成hnlg編寫如下程序:main() h(); printf(%xn,h);用tcc對此程序進行編譯、連接,注意會顯示什么提示信息?這些信息說明了什么? 提示信息說明了W1.c函數中調用的h函數沒有被定義。此程序的運行結果是什么?為什么?注意,要用debug加載,分析匯編指令。 用DEBUG加載如下:因為在調用h()函數時,有一次輸出,當調用h()函數后,返回到h()函數的下一條指令時,又有一次輸出函數。所以有兩次輸出。編寫如下程序:int n=0;main() fo

2、r(n=11;n15;n+); printf(%dn,n); n=11; while(n15)n+; printf(%dn,n); n=11; do n+; while(n=15時然后再將結果輸出。第二個與第一個一樣,也是先與15比較,滿足條件則加1操作,直到條件不滿足將n輸出。第三個循環(huán)實現的匯編代碼如下:這個循環(huán)的實現與前面的區(qū)別主要是先進行加操作,然后再與15作比較。深入研討的問題編寫如下程序:(通過此程序及相關問題的研究,了解C語言中字符串存儲機制。)char str12=hello world;int n=0 x2011;main() for(n=0;strn;n+)printf(%

3、c,strn); 先分析程序的執(zhí)行結果是什么?然后,再運行程序,驗證你的分析是否正確。分析的結果是:輸出來的就是字符串hello world循環(huán)是何時終止的?循環(huán)語句執(zhí)行了多少次循環(huán)?當strn=0時,也就是結尾符的ASKII碼時。在我的分析看來循環(huán)執(zhí)行了11次。用debug加載分析: 跳轉到0209處的代碼如下:取0194處的字符串中的字符到遇到結尾符也就是ASKII碼為00時就結束循環(huán)。而結尾符ASKII碼只占一個字節(jié),它占了全局變量n的高字節(jié),而整個循環(huán)過程中n的值12,它不會修改它的高字節(jié)的內容,也就是放結尾符的內存單元的值,除非循環(huán) 255,結果就不會是我們的理想結果了,而可能要輸出

4、比實際多的字符。字符串和全部變量n分別存儲在哪兒?各占多少字節(jié)大小的空間?字符串的存儲空間是放在以0194開始處的一片內存中。而緊跟著字符串后的00的偏移地址為01A0,而根據可知全局變量n就放在字符串的后面。字符串占了11個字節(jié),而全局變量n占了2個字節(jié)。將程序中的第一條語句修改為:char str12=hello world!;先分析程序的執(zhí)行結果是什么?然后,再運行程序,驗證你的分析與實際結果是否一直?如果不一致,說明原因。我覺得會輸出hello world!驗證結果為:為什么多了一個字符亂碼的輸出?這是怎么回事?debug繼續(xù)加載如下:最后多出來的一個字符的Askii碼是全局變量n的低

5、字節(jié)中的值,因為當全局變量n為12時,此時0194+12=01a0,此時取的值剛好為n的低字節(jié)的值,所以才會多輸出一個。N再加1時,此時便是n的高字節(jié)00,遇到0循環(huán)結束。編寫如下程序:(通過此程序及相關問題的研究,加深對指針變量的理解和認識。)int value_p;int addr_p;char value_pp;int addr_pp;main() char *p; p=(int *)0 x100; *p=0 x111; value_p=(int)p; addr_p=(int)&p; value_pp=*p; addr_pp=(int)(&(*p); printf(%x,%pn,valu

6、e_p,p); printf(%x,%pn,addr_p,&p); printf(%x,%xn,value_pp,*p); printf(%x,%pn,addr_pp,&(*p);用tcc對此程序進行編譯,會有警告,怎樣消除此警告?從匯編層分析此警告的合理性。將p=(int *)0 x100改為p=(char *)0 x100,便可消除警告出現該警告的原因是將一個指向兩個字節(jié)(也就是指向整型的地址)賦值給一個指向一個字節(jié)的字符的地址,肯定會造成類型不匹配,最后我的猜想是指針p指向了0 x100處的整數的低字節(jié)。驗證猜想:經驗證確實是將0 x111的低字節(jié)11放到0 x100所指的一個內存單元中

7、。用文字說明此程序的邏輯功能。首先該程序定義一個指向字符的一個指針,然后再將指向整型的一個指針賦值給p,如圖給該整型指針分配了兩個內存單元,然后p的值就為0100,因為p是指向字符的指針,所以此時p=0 x100的意思是指向0 x100處的一個字節(jié)單元的值。再將該內存單元中賦值0 x111.因為p指向的是一個字節(jié)單元。而賦的值為一個字。所以截取該字的低字節(jié)11放到p所指的地方去。接下來便是將指針p強制轉化成整型然后賦值給全局變量整型value_p中,如上對應的匯編指令可知。此處為全局變量value_p分配的內存單元為【0442】處的一個字單元。接下來又取指針p的地址(也就是系統(tǒng)為指針變量p分配

8、的內存單元的首地址)也就是當前0100所在內存單元的偏移地址然后直接將它賦值給addr_p,系統(tǒng)為addr_p分配的內存單元為【043e】處的一個字單元。然后又取p指針指向的內存單元的內容賦值給value_pp(系統(tǒng)分配的內存單元為0444處的一個字節(jié)單元),也就是將0100處的11賦值給value_pp.然后又將指針p所指的內存單元的偏移地址,其實就是p本身的值0100賦值給addr_pp(系統(tǒng)分配的內存單元便是【0440】處的一個字單元)。最后程序運行的結果為:用debug對此程序進行分析,然后,結合此程序說明:指針變量在底層是如何實現的。指針變量在底層是通過存放另外一個變量的偏移地址而實

9、現的。它存放的是其他變量的偏移地址。用debug對此程序進行分析,然后,結合此程序說明:運算符*,&的運算對象和運算結果分別是什么?*是取指針變量中存放的偏移地址所指向的內存單元中的內容。而&是取系統(tǒng)為指針p分配的內存的偏移地址。根據上面的研究結果和第5章的研究經歷,完成以下工作:先分析說明運算符的運算對象和運算結果分別是什么,再設計程序驗證你的結論。運算符【】的對象必須是指針類型,運算結果是某個內存單元的地址。下面是自己猜想中是不是只能是整型而做的研究:驗證的程序如下:main() char a; int b10; for(a=1;a=9;a+) ba=1;通過單步調試,發(fā)現a的變化并沒有從

10、31變到39,而是從62變到78.,并且,【】運算是將a的值強制轉化成整型再加上b的偏移地址。所以雖然此程序中a的值一開始是字符型的。但是系統(tǒng)會將它轉化成整形。由此可驗證的運算對象本質上是針對整型,運算結果便是相對偏移地址。此程序在看匯編代碼時覺得很奇怪,系統(tǒng)為該程序中分配了16個棧單元,在分析時,只用到了【bp-15】與【bp-14】而其余的似乎沒用到,為數組分配的內存單元也應該不止是16個,至少也要18個。不知道什么原因,有待探討。3、思考,研究:變量在底層的實際存儲次序與什么因素相關?與變量的定義次序相關?還是變量的使用次序相關?還是可以用以下程序及其的相關變換進行研究,程序如下:char *p;char *pa;char *pf;main() p=(char *)0 x1000; pa=(char *)0 x10

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論