第一週:經過彙編一個簡單的C程序,分析彙編代碼理解計算機是如何工做的

姓名:呂鬆鴻 編程

    學號:20135229小程序

( *原創做品轉載請註明出處*)緩存

( 學習課程:《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 )函數

1、存儲程序計算機

1.1馮諾依曼體系結構:即具備存儲程序的計算機體系結構

目前大多數擁有計算和存儲功能的設備(智能手機、平板、計算機等)其核心構造均爲馮諾依曼體系結構佈局

  1. 從硬件來看
  • CPU與內存經過主線鏈接,CPU上的IP(多是1六、3二、64位)總指向內存的某一塊區域;IP指向的CS(代碼段)也在內存中;CPU老是執行IP指向的指令。

     2. 從軟件來看學習

  • API(應用程序編程接口,與編程人員)與ABI(程序與CPU的藉口界面) 是兩個比較重要的軟件接口

1.2 

關於ABI:指令編碼;指令中涉及的寄存器佈局;大多數指令能夠直接訪問內存編碼

1.3 

(E表明32位系統)EIP在CPU執行完一條指令以後自加一(自動加一條指令,而不是一個字節或是32位),固然也能夠被其它指令,如CALL,RET等修改spa

2、x86彙編基礎

2.1 x86(32位)的寄存器中,低16位做爲16位register

2.2 關於堆棧段寄存器

EBP(堆棧基址寄存器);ESP(堆棧頂指針寄存器)。上述兩個寄存器較爲頻繁地使用於彙編程序中指針

2.3 關於代碼段寄存器

CPU實際取指令的時候經過cs:eip來描述code

2.4 64位CPU

其實與32位在覈心機制上差異不大,64位的機器中,寄存器以RXX表示

2.5 常見彙編指令

  1. 後綴的b,w,l,q分別表明8,16,32,64位
  2. 以%標識的寄存器尋址不與內存「打交道」
  3. 直接尋址&當即數尋址
    1. movl $0x123,%eax —— %eax=0x123
    2. movl 0x123,%eax —— 當即數是以$開頭的十六進制數值。直接訪問指定的內存地址(0x123)中的數據而後賦給%eax
  4. 變址尋址  movl 4(%ebx),%edx//edx = *(inet_32 *)(ebx+4),即ebx的值加4以後做爲一個地址,將其指向的數據賦給%edx
  5. 大多數指令均可以直接訪問內存地址
  6. Linux使用的A&T彙編格式與Intel彙編略有不一樣
  7. 幾條重要的彙編指令


2.6彙編小程序練習

 

3、彙編一個簡單的C程序

3.1 將C代碼編譯成彙編代碼

  • 將代碼在實驗樓環境中(64位)保存以後,建議使用 -m32將其編譯爲32位的彙編代碼
  • 具體以下:

    gcc -S -o main.s main.c -m32
  • 關於leave指令
    • leave指令與enter指令一塊兒至關於兩條宏指令
    • enter指令至關於在原來的堆棧上再建一個新的空堆棧【由於將棧底指針%ebp挪到和棧頂指針相同的位置了】
    • leave指令與enter相反,至關於撤銷函數調用堆棧【把棧頂指針提上來,則撤消了該棧】
  • 函數調用堆棧是由邏輯上多個堆棧疊加起來的。
  • 函數的返回值默認用%eax存儲,而後返回給上一級函數。

3.2 練習2

 

  1. 函數應該以下:

    int g(int x)
    {
        return x+8;
    }
    int main(void)
    {
        return g(8)-8;
    }

 實驗部分

實驗步驟

實驗代碼:

代碼彙編結果

 

實驗分析如圖:

實驗總結:

1.計算機的硬件設施部分,就如第一講中講到的那樣,除了核心CPU以外,還有寄存器、高速緩存、主存乃至外存這樣種類繁多的存儲設備。存儲設備(這也是馮 諾依曼體系結構的一個重要支點)根本目的就是爲CPU服務,存儲各類各樣的、區分輕重緩急的數據;

2.一步一步對彙編語言進行分析,使我對堆棧的調用認識更加深入,對這部分的知識更加了然於胸,對我從此的課程奠基了紮實的基礎

相關文章
相關標籤/搜索