試驗題目:計算機是怎麼樣工作的?
實驗環境:ubuntu 9.10
實驗內容和步驟:
在linux下c
**經過預處理,編譯成彙編**,彙編成目標**和鏈結成
elf可執行檔案,依次生成
.cpp .s .o elf
檔案,下面通過
example.c
觀察其過程
1、預處理 gcc -e -o example.cpp example.c
預處理的過程主要處理那些源**檔案中以「#
」開始的預編譯指令,如
#include
,#define
等內聯展開等,下面擷取的一部分預編譯後的檔案
可通過wc
指令檢視具體的差異
example.c
和 example.cpp
具體的差異會發現明顯的比原始檔大不少
1、編譯成彙編** gcc -x cpp-output -s -o example.s example.cpp
檢視彙編**
3、把彙編**彙編成目標**
gcc -x assembler -c example.o example.s
4、把目標**鏈結成elf
可執行**
gcc -o example example.o
example.s無法檢視到**的實際執行位址,於是用
gdb
的disas
反彙編檢視
命令如下:
gdb example
disas main
disas f
disas g
main 反彙編
f 函式反彙編
g 函式反彙編
分析整個程式的執行過程
pushl %ebp //入棧,該
ebp是
main
函式的基址位址
movl %esp,
%ebp // %ebp = %esp ,ebp
指向新函式的基址位址,此時與
esp一樣指向棧底
subl $4 , %esp //棧向下生長,
esp=esp-4
movl $8,(%esp) //把8放入
esp所指的記憶體空間中,即入棧,區域性變數儲存
call f //等價於
push %eip //eip
存放當前指令的下一條指令
movl 0x80483b8f %eip //進入對f呼叫
f: push %ebp
mov %esp,
%ebp
sub $0x4 %esp
mov $0x8(%esp), %eax //把
esp+88放入
eax中
這裡可以看到把8傳給f
不是直接把實參傳遞,而是對其做 乙個copy
的副本傳遞的
mov %eax ,(%esp) //把
eax中的值放入
esp所指的記憶體的中
call 0x80483b4//呼叫g函式
相當於:push %eip
mov $0x80483b4 %eip
以上是單個程式的執行過程,但是在多工的情況下情況是什麼樣的呢?
在單核的計算機系統中不存在真正的並行運算/執行,在任務的執行是在巨集觀上並行,微觀上序列,他的執行過程是,每個任務在執行時,以時間輪片的方式(多種策略中的一種),給每乙個任務設定乙個時間片,當時間片用完時,觸發中斷,系統呼叫另外乙個任務執行,在中斷的過程中要確保下一次任務能正確的返回被中斷處繼續執行,這就要求,儲存當前被中斷的任務要執行的下一條指令入棧,待到返回時能夠正確的返回當前被中斷的任務而繼續往下執行
總結:
計算機的工作並不是表面上看的c
**表面上的意思,它的真正的執行過程
整個程式的執行過程是main
—>f
—>g—f
—>g
—>main,多工條件下(單核計算機系統中)的任務的執行也是按照與此類似的過程
計算機組成原理 計算機是如何工作的
一 計算機的組成 計算機硬體是由如下幾部分組成的 運算器,控制器,儲存器,輸入輸出裝置 假設我們在生活中,要完成乙個運算。我們需要算盤,需要一張紙,需要一支筆。y a x b c 我們應該如何計算上面的算式?1 將計算的步驟和資料,寫在紙上 2 用算盤進行加減乘除等操作 3 利用筆將原始資料,結題步...
CPU是怎麼計算機 2 3的
假設x 2,y 3 x y 從cpu的角度,他是怎樣計算的呢 第1步 把2和3進行異或操作 得到結果 0001存放到某處 0010 0011 0001 第2步 再把2和3進行與操作 得到結果 0010 0010 0011 0010 再把0010左移1位得到0100,判斷移位後的結果是否為0,如果為為...
計算機的工作原理
半個世紀以來,計算機已發展成為乙個龐大的家族,儘管各種型別的效能 結構 應用等方面存在著差別,但是它們的基本組成結構卻是相同的。現在我們所使用的計算機硬體系統的結構一直沿用了由美籍著名數學家馮 諾依曼提出的模型,它由運算器 控制器 儲存器 輸入裝置 輸出裝置五大功能部件組成。隨著資訊科技的發展,各種...