標籤:
姓名:呂松鴻
學號:20135229
( *原創作品轉載請註明出處*)
( 學習課程:《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 )
一、儲存程式電腦1.1馮諾依曼體繫結構:即具有儲存程式的電腦體繫結構
目前大多數擁有計算和儲存功能的裝置(智能手機、平板、電腦等)其核心構造均為馮諾依曼體繫結構
- 從硬體來看
- CPU與記憶體通過主線串連,CPU上的IP(可能是16、32、64位)總指向記憶體的某一塊地區;IP指向的CS(程式碼片段)也在記憶體中;CPU總是執行IP指向的指令。
2. 從軟體來看
- API(API,與編程人員)與ABI(程式與CPU的借口介面) 是兩個比較重要的軟體介面
1.2
關於ABI:指令編碼;指令中涉及的寄存器布局;大多數指令可以直接存取記憶體
1.3
(E代表32位系統)EIP在CPU執行完一條指令之後自加一(自動加一條指令,而不是一個位元組或是32位),當然也可以被其它指令,如CALL,RET等修改
二、x86彙編基礎2.1 x86(32位)的寄存器中,低16位作為16位register2.2 關於堆棧段寄存器
EBP(堆棧基底位址暫存器);ESP(堆棧頂指標寄存器)。上述兩個寄存器較為頻繁地使用於組譯工具中
2.3 關於程式碼片段寄存器
CPU實際取指令的時候通過cs:eip來描述
2.4 64位CPU
其實與32位在核心機制上差別不大,64位的機器中,寄存器以RXX表示
2.5 常見彙編指令
- 尾碼的b,w,l,q分別代表8,16,32,64位
- 以%標識的寄存器定址不與記憶體“打交道”
- 直接定址&立即數定址
- movl $0x123,%eax —— %eax=0x123
- movl 0x123,%eax —— 立即數是以$開頭的十六進位數值。直接存取指定的記憶體位址(0x123)中的資料然後賦給%eax
- 變址定址
movl 4(%ebx),%edx//edx = *(inet_32 *)(ebx+4),即ebx的值加4之後作為一個地址,將其指向的資料賦給%edx
- 大多數指令都可以直接存取記憶體位址
- Linux使用的A&T彙編格式與Intel彙編略有不同
幾條重要的彙編指令
2.6彙編小程式練習
三、彙編一個簡單的C程式3.1 將C代碼編譯成彙編代碼
3.2 練習2
函數應該如下:
int g(int x){ return x+8;}int main(void){ return g(8)-8;}
實驗部分實驗步驟
實驗代碼:
代碼彙編結果
實驗分析
實驗總結:
1.電腦的硬體設施部分,就如第一講中講到的那樣,除了核心CPU之外,還有寄存器、快取、主存乃至外存這樣種類繁多的存放裝置。存放裝置(這也是馮 諾依曼體繫結構的一個重要支點)根本目的就是為CPU服務,儲存各種各樣的、區分輕重緩急的資料;
2.一步一步對組合語言進行分析,使我對堆棧的調用認識更加深刻,對這部分的知識更加瞭然於胸,對我今後的課程奠定了紮實的基礎
通過彙編一個簡單的C程式,分析彙編代碼理解電腦是如何工作的