組合語言 使用記憶體空間,組合語言記憶體
組合語言 使用記憶體空間
在上一個實驗我們已經知道,c語言使用寄存器需要我們給出相應寄存器的名稱,在函數執行過程中就能一一對應。
下面,我們來研究c語言如何使用記憶體空間:
我們已經知道像位移地址2000h中寫入一個位元組的內容,我們用如下方法:
*(char *)0x2000=’a’;
像2000:0寫入一個位元組用如下方法:
*(char far *)0x20000000=’a’;
有了上面兩點知識下面進行實驗:
1、編寫一個程式um1.c
編譯、連結產生.exe檔案,然後用debug載入,對main函數代碼進行分析
我們可以找到相應的c代碼對應的組合語言
下面進行單步跟蹤:將cs置為0d6c ip置為01fa
我們可以在相應的地方找到賦給的值
接下來的幾條指令也跟上面類似
2、編一個程式,用一條c語言實現在螢幕中央顯示一個綠色的字元‘a’
圖中的0b8000000 表示顯示器的第一個地址 後面加的表示12行 中間地址
02表示屬性為綠色,61表示字元‘a’。
3、分析下面的彙編代碼
編譯、連結用debug載入查看相應的彙編代碼
從上面圖片代碼中,我們很容易知道,c語言將全域變數放在ds:[01A6]的資料區段中,並且越先開始定義的資料存放的地址比後面定義的資料要低,上面a1的位移地址小於a2,而a2又小於a3。
從最後兩條指令可以看出,c語言將局部變數存放在棧段中,並且按照定義變數的順序,從棧頂向下依是b1,b2,b3,可以這樣講,先定義哪個變數,哪個變數就越放在棧中地址低的地方,即越靠近棧頂。
至於push bp mov bp,sp 這兩條指令,其實我們在前面的學習中已經接觸過了,目的是為了保護這些返回程式需要的值,因為在後面用到棧的時候可能會破壞bp的值。
4、分析下面的程式的彙編代碼,思考相關問題
編譯、連結用debug載入相應的exe檔案
首先看到調用子程式call 020a命令,找到020a地址 看裡面對應的程式,我們不難發現代碼中使用了ax寄存器,我們就不難猜想,c語言將返回值存放在AX中。
5、下面理解malloc函數的用法
我們學習c語言可以知道malloc函數的用法
malloc(size);
malloc 向系統申請分配指定size個位元組的記憶體空間。
現在我們來分析該程式,
第一行、表示malloc向記憶體申請空間時從0200:0000地址開始申請,這個空間使我們程式員可以用的安全空間
第四行、表示用malloc申請20個類型為char的空間,即20個位元組
第五行、表示在buffer的基地址上加十,即從申請的第十個地址開始,賦值為零。
下面整個while迴圈是為了給buffer[0]到buffer[7]賦值‘a’-‘h’
Buffer[10]是充當計數器的作用,首先這個計數器為0,把地址Buffer中賦(61h+0)值,然後計數器加1,再把(61h+1)賦給地址Buffer+1,這樣依次迴圈,使得Buffer[0]到Buffer[7] 依次存放‘a’’b’’c’…’h’。
@yujin753
2015-02-28 22:43
字數 1228
閱讀 0×正在載入文章圖片,請稍等片刻...