1. 程式人生 > >2018-2019-1 20189203《Linux核心原理與分析》第二週作業

2018-2019-1 20189203《Linux核心原理與分析》第二週作業

一、本週學習情況

我本週結合《庖丁解牛》教材學習了藍墨雲的視訊課,主要學習內容如下:

 1、學習了計算機的工作原理,深入理解了馮諾依曼體系結構。
 2、學習了X86-32 CPU的暫存器
 3、學習了定址方式和常用匯編指令
      - 立即數即常數,如$8,表示$開頭後跟一個數值;
      - 暫存器數,表示某個暫存器中儲存的值,如%exa
      - movL表示32位指令
     - 通用暫存器:
     - EAX:累加器
     - EBX:基地址暫存器
     - ECX:計數暫存器
     - EDX:資料暫存器
     - ESI:源變址暫存器
     - EDI:目的變址暫存器
     - EIP:指令指標暫存器
  • 幾種常用的暫存器定址方式及程式碼:
    register mode(暫存器定址):movl %eax,%edx edx=eax;把eax內容放入edx,等號相當於把eax賦值給edx。
    immediate(立即定址):movl $0x123,%edx edx=0x123; 立即數是以$開頭的數值,把16進位制的數值放入edx。
    direct(直接定址):movl 0x123,%edx edx=*(int32_t*)0x123;記憶體地址16進位制的123記憶體放入edx,把0x123強制轉化成32-bit的指標,表示取它的值。
    indirect(間接定址):movl (%ebx),%edx edx=*(int32_t*)ebx

    ;ebx這個暫存器存的值加個括號表示記憶體地址,所儲存的資料放入edx。
    displaced(變址定址):movl 4(%ebx),%edx edx=*(int32_t*)(ebx+4); 除了在間接定址的基礎上先給ebx地址上加個立即數ebx+4。
    相關的定址方式在資料結構中曾經學習過。

    二、通過反彙編一個簡單的C程式,分析彙編程式碼理解計算。

  • 首先在Linux中寫一段C程式。隨後通過Linux中的編譯命令將其編譯為彙編指令:


  • 最後整理之後的程式碼如下:
  • 下面開始分析程式執行過程:
    程式碼在執行過程中堆疊空間和相應的EBP/ESP暫存器會不斷變化。首先假定堆疊為空棧的情況下EBP和ESP暫存器都指向棧底。具體執行過程如下:


  • 遇到的困難:之前沒有接觸過組合語言,在學習和理解的過程中遇到了很多困難,在通過對實驗程式的分析,加深了對棧的理解,也基本理解了一些簡單組合語言的用法。後續還需要反覆練習和重溫。