前麵介紹了三方麵的基礎知識:(1)數據信息的表示方法,數據是計算機處理的對象。(2)編製程序的語言與機器指令,以及程序的組織結抅,程序是計算機執行的命令信息。(3)硬件工作的邏輯基礎。現在我們將這些知識加以綜合,進一步去了解一台計算機係統究竟是怎樣組成,如何工作?它包括哪些硬件部件與軟件模塊?各主要組成部分的基本原理,從而建立一個整機概念。
在微型計算機中,CPU(包括運算器與控製器)已被集成在一塊芯片之中,使用者主要應了解它的外部功能特性,對芯片內部隻需作一般了解。但為了掌握計算機的內部工作原理,我們在前兩節將全麵介紹運算器與控製器的內部組成與原理,重點闡述這樣一個問題:計算機究竟怎樣執行程序?在後麵幾節,我們將以IBM-PC/XT微機為主要背景,一方麵介紹基本原理,一方麵介紹有關實用知識。
5.1運算方法與運算部件
運算部件是CPU中的組成部件之一,負責運算處理。我們先將它從CPU中分出來加以介紹,說明計算機是如何實現運算功能的。
一、定點四則運算方法
1.加減運算方法
在2.2中已經舉例說明,采用補碼加減運算比較方便,可以化減為加,隻需一個加法器就可以完成加減運算。運算規則如下:
(1)參與運算的操作數用補碼表示。
(2)符號位作為數的一部分,參與運算。
(3)若操作碼為加,則將兩數直接相加,所得結果為補碼表示的和值。
(4)若操作碼為減,則將減數變補後與被減數相加,所得結果為補碼表示的差值。
2.定點乘法運算
如果構造一個單獨的乘法器,則采用原碼乘法比較簡單,但為了兼顧補碼加減運算,也常應用補碼乘法,在算法上要稍為複雜一些。所謂原碼乘法是指:先將相乘的二數取絕對值相乘,再根據“同號相乘為正、異號相乘為負”,加符號位。而補碼乘法則是:用補碼表示操作數,連同符號位按有關算法運算,具體算法請參閱《計算機組成原理》教材。本書僅簡略介紹原碼乘法的基本思想。
(1)常規手算方式
眾所周知,在常規的手算方式中如此處理:先對應於每一位乘數求得一項部分積,然後將所有部分積一次相加,求得最後乘積9。
因為各位乘數的權不同,所以每次新部分積都要左移一位,才能相加。如果讓計算機按上述方式處理,存在二個問題:(1)需要二倍字長的加法器,如果是4位x4位,至少需要8位長的加法器。(2)n項部分積同時相加,需要一個能實現n個操作數相加的加法網絡,比較複雜。
因此我們有二種作法:(1)如果要求乘法運算速度很高,可采用一種“陣列乘法器”,采取一種與手算方式相似的算法,同時形成各項部分積,逐級累加,在一拍內求出乘積。這種方法的硬件代價高些。(2)如果要求的速度並不高,可采用逐次產生部分積並累加的方法,它的基本思想是將乘法轉化為n次累加與移位,可與加減運算共用一個加法器。下麵介紹後一種方法。
(2)原碼一位乘法
在計算機中實現原碼一位乘法,需要一個加法器E,三個寄存器A、B、C,運算前將被乘數存放在B寄存器中,將乘數存放在D寄存器中,用A寄存器存放部分積的累加和,其初始值為0。我們先列出運算過程,再作解釋。內容與被乘數醜相加,算式中證明本次操作為+占,從加法器獲得和。為了在n位的加法器中實現部分積累加,改進了手算方式的作法,不是讓新部分積左移一位,而是讓原來求得的部分積累加和先右移一位,操作記為“―”,這樣處理,其部分積相對關係與手算方式相同,但由於累加和的低位被移走,不參與相加,所以加法器的位數隻要11位就夠了,不需要2x1位。這個低位右移到那裏呢?由於已處理過的乘數低位也不再參與運算,已無必要保存,所以可讓C寄存器在每次求得部分積並累加後,也右移一位,一方麵將已處理過的低位乘數移出,同時將部分積累加和的低位移入C寄存器的高位中。
C寄存器右移一位後,新的待處理的乘數低位,也移至C寄存器末位C,所以每次都是根據C,決定下一步的操作。需要注意的是:小數點之前的符號位本是用來指示數的正負,但在求部分積累加和時也可以用來暫時存放進位信息。如本例的第二步,求累加和之後,就有進位1暫時存在符號位。這是絕對值相乘,在最後加符號位之前一直是正數,所以符號位中這個暫時保存的數1,並不代表累加和變負。相應地在右移時,這個暫存的進位值1又作為有效數值,被右移到表示數值大小的有效數位之中,而符號位恢複為0。4位乘數,乘4步。最後,A寄存器中存的是高4位乘積,C寄存器中存的是低4位乘積,再加上應有的乘積符號。
3.定點除法運算除法也有原碼除法與補碼除法之分。原碼除法是指:先取絕對值相除,然後按“同號相除為正,異號相除為負”加符號。補碼除法則是:用補碼表示被除數與除數,按補碼除法規則相除,所得的商與餘數都是用補碼表示的結果。實現除法的硬件有兩類:(1)采用陣列除法器結構,所用的芯片將各次的減除數操作邏輯,與求商的邏輯集成在一起,能在一拍中完成n位除的運算。這種除法器的速度快,但硬件成本高些。(2)另一種作法是:將a位除轉換成n次(加)減除數與逐位上商,分成n步完成。這種方法的速度較慢,但硬件成本低些。編製除法子程序,用軟件方法實現除法時,也采用後一種方案。本節將介紹後一方案,與對乘法的闡述方法相似,也是先列出常規手算除法的算式,再介紹計算機中采用的一種除法算法。眾所周知:不夠減,商0,被除數末位補0;夠減,商1,減除數,餘數末位被0。
如果要計算機實現除法,需解決幾個問題:(1)讓被除數(以後是各次餘數)左移一位,就相當於末位補0。(2)怎樣知道是否夠減?手算時是靠人判別,如果不夠減,就不去減除數。計算機則是先減除數,然後比較所得餘數與除數的符號位,如果二者相同,表明夠
(2)原碼不恢複餘數除法所需硬件與乘法相近,用一個加法器S實現加減(用加機器負數的方法,化戚為加),將被除數存放在A寄存器中,以後A寄存器將存放各次餘數,將除數存放在B寄存器中,用C寄存器存放商。
除法運的基本操作是:左移一位(末位補0),鹹(或加)除數,根據餘數符號判定上商值。減除數即加(-B),加除數即+B。在原碼除法中,.除數取絕對值,如果所得餘數符號位也為0,則與除數同號,表明夠鹹,上商1,從C寄存器末位送入;如果所得餘數符號位為1,則與除數異號,表明不夠戚,上商0-本例是定點小數運算,並讓被蹄數小於除數,使商值也是定點小數。左移時,符號位暫時保存左移後的最高數位,如第1、3、4步情況,並不是將正數左移成了負數。戚除數,本應減去(0.:1111),改為加除數的機器負數,即加(1.0001),化減為加。由於每除一次,餘數就左移一位,權值比真實的權值大了一倍,所以在除了四次之後,最後餘數值是A寄存器內容乘以:T4,恢複其應有杈值。本例是兩個正數相除,所得的商取正號。
上麵介紹的乘、除算法,可以作為清除器哽件設計的依據,也可以作為編製乘、除子程序的依據。
二、浮點四則運算簡介
原則上可將浮點運算轉換為二個定點運算,徂要注意階碼(定點整數)與尾數(定點小數)之間的關係。
1.浮點加減
大家知道,二數相加減時,必須首先將它們的小數點位置對準。在浮點數中,是用階碼間接表示小數點位置,所以浮點數加減時,必須先對階,讓二數的階碼調整到同一值。
在例中,階碼以2為底,加數的階碼為-2,而被加數的階碼為0,兩浮點數的尾數都是規格化的,即尾數的絕對值都>士。但是這二個浮點數的階碼不等,尾數不能直接相加,必須先對階。對階的原則是讓階碼小的數向階碼大的數對齊,所以將加數改寫為2QX0.001101,即階碼調整為0,與被加數的階碼一致,相應地將其尾數右移二位,加數的值仍保持不變(階碼加了2,而尾數則縮小了四倍)。對階完成後,尾數就可以相加了。如果加減後尾數不是規格化,就需要進行結果規格化。
三、並行加法器及其進位鏈
前麵討論的算法都以加法器為核心,能在一拍內實現n位同時相加的加法器,稱為並行加法器。但是稍作思考就會想到,n位數相加,存在一個進位問題,原則上是由低位起,逐級向高位傳遞。雖然用n位全加器同時讓各位相加,但高位和可能與低位來的進位有關,形成高位和穩定值所需的時間要比低位長。為了提高整體運算速度,有必要設置專門的進位傳遞邏輯電路,加快各位進位信號的形成速度,我們將這種進位傳遞邏輯叫做進位鏈。因此一個n位的並行加法器由二部分組成:11個全加器,一套進位鏈邏輯。全加器常用半加器(導或門)構成,關鍵是如何組成進位鏈。