2018-2019-1 20189203《Linux核心原理與分析》第二週作業
阿新 • • 發佈:2018-11-10
一、本週學習情況
我本週結合《庖丁解牛》教材學習了藍墨雲的視訊課,主要學習內容如下:
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
displaced(變址定址):movl 4(%ebx),%edx edx=*(int32_t*)(ebx+4)
; 除了在間接定址的基礎上先給ebx地址上加個立即數ebx+4。
相關的定址方式在資料結構中曾經學習過。二、通過反彙編一個簡單的C程式,分析彙編程式碼理解計算。
- 首先在Linux中寫一段C程式。隨後通過Linux中的編譯命令將其編譯為彙編指令:
- 最後整理之後的程式碼如下:
- 下面開始分析程式執行過程:
程式碼在執行過程中堆疊空間和相應的EBP/ESP暫存器會不斷變化。首先假定堆疊為空棧的情況下EBP和ESP暫存器都指向棧底。具體執行過程如下:
遇到的困難:之前沒有接觸過組合語言,在學習和理解的過程中遇到了很多困難,在通過對實驗程式的分析,加深了對棧的理解,也基本理解了一些簡單組合語言的用法。後續還需要反覆練習和重溫。