組合電路和時序電路是計算機原理的基礎(chǔ)課,組合電路描述的是單一的函數(shù)功能,函數(shù)輸出只與當前的函數(shù)輸入相關(guān);時序電路則引入了時間維度,時序電路在通電的情況下,能夠保持狀態(tài),電路的輸出不僅與當前的輸入有關(guān),而且與前一時刻的電路狀態(tài)相關(guān),如我們個人PC中的內(nèi)存和CPU中的寄存器,均為時序電路。
說了這么多,我們學習的組合電路和時序電路在計算機中又是怎么一回事呢?為了便于理解,下面以一個大家都能接受的C語言程序開始,從上層向下層開始解釋。
void main(){
int a = 3, b = 5;
int sum = a + b;
}
這個例子大家都能明白,main函數(shù)要做的事情就是實現(xiàn)兩個數(shù)的加法操作。這是我們?nèi)祟惖乃季S方式,但是計算機并不認識,如何讓計算機理解呢?于是,我們需要將上面這個程序翻譯成機器能理解的模樣,這時候就需要借助編譯器(如常見的gcc、msc等)將上面的程序翻譯成MIPS指令(不同的CPU有不同的指令集,包括X86指令集、MIPS指令集、Sparc指令集等,我們在這里用MIPS指令集,咱們的龍芯也是采用MIPS指令集),如下所示:
#下面的每條匯編代碼對應(yīng)一個二進制
addi $t0, 0, 3 # a = 0+3, a保存在$t0寄存器中, 對應(yīng)的二進制代碼為:0010 00** **** **** **** **** **** ****(這里的星號*表示二進制,這里暫時不關(guān)心)
addi $t1, 0, 5 # b = 0+5, b保存在$t1寄存器中
addi $t2, $t1, $t0 # sum = a + b, sum保存在$t2寄存器中
到這里,大家一定還在疑惑,不是說要翻譯成二進制代碼嗎?怎么是MIPS匯編語言?對,就是匯編語言,這個匯編語言中的每一條指令就對應(yīng)一條二進制代碼,匯編的方式更容易讓人理解。
現(xiàn)在我們得到了計算機可以理解的MIPS指令(可以想象成可執(zhí)行程序)了,接下來的問題是如何執(zhí)行MIPS指令。
要執(zhí)行程序,首先必須將可執(zhí)行程序文件(從外設(shè))加載到內(nèi)存。可執(zhí)行文件加載到內(nèi)存時,操作系統(tǒng)會為每個可執(zhí)行程序在內(nèi)存中分配四個區(qū):
1 代碼區(qū)。也就是前面的到的匯編代碼所對應(yīng)的二進制碼
2 全局數(shù)據(jù)區(qū)。全局變量,靜態(tài)變量放在這個區(qū)
3 堆區(qū)。表示在程序執(zhí)行過程中,動態(tài)申請的空間在這個區(qū),如C語言中的malloc, free操作均是針對此區(qū)中的對象執(zhí)行申請或釋放操作
4 棧區(qū)。函數(shù)運行時,局部變量的保存區(qū)域。
我們重點關(guān)注代碼區(qū)和棧區(qū),初始時,其分布如下圖所示:
代碼區(qū)-1.png
其中PC(Program Counter)是程序計數(shù)器(是CPU中的一個寄存器,具有數(shù)據(jù)存儲功能),即用來指示下一個即將執(zhí)行的指令的地址,本例中,進入main函數(shù)后,即將執(zhí)行的第一條指令是a = 3,其地址為:0X FF FF FF 00, 因此PC指向其對應(yīng)的匯編代碼的地址。
CPU根據(jù)PC的的值,從指定地址0X FF FF FF 00處獲取指令,然后解析指令,并執(zhí)行指令(即執(zhí)行a=3)。
當a = 0執(zhí)行完畢后,PC執(zhí)行操作:PC = PC + 4,PC指向0X FF FF FF 04,即b = 5的指令的地址。此時,棧區(qū)的狀態(tài)為:
棧區(qū)-1.png
接著,CPU根據(jù)PC的的值,從指定地址0X FF FF FF 04處獲取指令,然后解析指令,并執(zhí)行指令(即執(zhí)行b=5)。當b=5執(zhí)行完畢后,PC執(zhí)行操作:PC = PC + 4,PC指向0X FF FF FF 08,即sum=a+b的指令的地址。此時,棧區(qū)的狀態(tài)為:
棧區(qū)-2.png
然后,CPU根據(jù)PC的的值,從指定地址0X FF FF FF 08處獲取指令,然后解析指令,并執(zhí)行指令(即執(zhí)行sum=a+b)。當sum=a+b執(zhí)行完畢后,PC執(zhí)行操作:PC = PC + 4,PC指向0X FF FF FF 12(因為,指令已經(jīng)執(zhí)行完畢,這里應(yīng)該提示要從main函數(shù)返回)。此時,棧區(qū)的狀態(tài)為:
棧區(qū)-3.png
至此為止,main函數(shù)內(nèi)部的流程基本上陳述完了(關(guān)于函數(shù)間調(diào)用,相對復(fù)雜,計算機組成中會詳細講解),但如何實現(xiàn)這些步驟呢,其中的關(guān)鍵問題包括如下:
問題:
1、知道內(nèi)存地址,如何定位到那個地址???答案:地址譯碼器
2、獲取到a=3對應(yīng)的指令后,如何知道是做a=0+3的操作???答案:解析指令,指令譯碼器
3、PC寄存器如何保存值?如何做加4操作?答案:計數(shù)器(寄存器講解)
-
計算機
+關(guān)注
關(guān)注
19文章
7494瀏覽量
87933 -
時序電路
+關(guān)注
關(guān)注
1文章
114瀏覽量
21698 -
組合電路
+關(guān)注
關(guān)注
0文章
11瀏覽量
6692
發(fā)布評論請先 登錄
相關(guān)推薦
評論