一、實驗過程:
實驗內容爲通過彙編一個簡單的C程序,分析彙編代碼理解計算機是如何工作的。
1.進入linux實驗環境,打開一個終端。
2.打開Code文件下的shiyanlou_cs195文件夾,vi mian.c文件。
3.輸入命令gcc -S -o main.c mian.s -m32得到main.s文件。
4.刪除以點開頭的行,得到最終的main.s。
二、分析彙編代碼的工作工程。
1.首先理解ebp是指向棧底的,esp指向當前棧執行的一條指令,eip指向當前程序按順序執行的指令,eax存儲上一級函數的返回值。
2.剛開始從main函數開始執行前四條指令,只要作用讓棧中0的位置爲ebp 0,棧1的位置存放8.
3.執行call f時此時棧2的位置放的是eip 23.即當前的下一條指令也就會到f函數完成後回溯到接下來的第23行指令。
4.接下來eip指向f函數的第一行指令,f的前5行指令作用是棧3的位置存放ebp 1,eax的值爲8,棧4的位置存放eax 8。
5.執行call g時此時棧5的位置放的是eip 15.即當前的下一條指令也就會到g函數完成後回溯到接下來的第15行指令.
6.接下來eip指向g函數的第一行指令,g函數前兩行作用是讓棧6存放ebp 4,第三行和第四行指令作用是讓eax=8+4=12.
7.接下來g函數popl %ebp,將ebp指向之前4的位置,ret即pop eip的意思,將eip 15pop出來 讓eip指向之前f函數的15的位置。
8.leave即讓esp指向ebp的位置同時pop ebp,使ebp指向之前的1的位置,接下來的ret 即pop eip ,讓eip指向之前的main函數的23行的位置。
9.main的23行add 將eax的值變爲eax=12+2=14.最後的leave和ret讓ebp和esp都指向最初的底棧的位置。
三、理解計算機怎樣工作的。
1.彙編一個簡單的計算機的基本原理是存儲程序和程序控制。預先要把指揮計算機如何進行操作的指令序列(稱爲程序)和原始數據通過輸入設備輸送到計算機內存貯器 中。每一條指令中明確規定了計算機從哪個地址取數,進行什麼操作,然後送到什麼地址去等步驟。
2.計算機在運行時,先從內存中取出第一條指令,通過控制器的譯碼,按指令的要求,從存儲器取出數據進行的運算和邏輯操作等加工,然後再按地址把結果送到內存中去。接下來,再取出第二條,在控制器的指揮下完成規定操作。依次進行下去。直至遇到停止指令。