組合語言 使用記憶體空間,組合語言記憶體

來源:互聯網
上載者:User

組合語言 使用記憶體空間,組合語言記憶體

組合語言 使用記憶體空間

在上一個實驗我們已經知道,c語言使用寄存器需要我們給出相應寄存器的名稱,在函數執行過程中就能一一對應。 
下面,我們來研究c語言如何使用記憶體空間: 
我們已經知道像位移地址2000h中寫入一個位元組的內容,我們用如下方法:

 
  1. *(char *)0x2000=’a’;
  2. 像2000:0寫入一個位元組用如下方法:
  3. *(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×正在載入文章圖片,請稍等片刻...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.