天天看點

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

本節書摘來自華章計算機《計算機系統:核心概念及軟硬體實作(原書第4版)》一書中的第3章,第3.3節,作者:[美] j. 斯坦利·沃法德(j. stanley warford)著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

因為計算機中所有資訊都是以二進制存儲的,是以cpu就用二進制運算來處理這些資訊。前面章節提到了not、add和neg這些二進制運算:not是邏輯運算符,add和neg是算術運算符。本節我們再講一些其他的在計算機cpu中有用的邏輯和算術運算符。

3.3.1邏輯運算符

我們熟悉邏輯運算and和or。另一個邏輯運算符是異或,寫作xor。若p為真,或者q為真,但不同時為真,那麼p和q的異或邏輯值為真。即,p一定真異于q,或者q必須真異于p。

二進制數字一個有趣的屬性是可以把它們作為邏輯值來解讀。在isa3層,位為1表示真,位為0表示假。圖3-15展示了and、or和xor運算符在isa3層的真值表。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

在hol6層,and和or對值為真或假的布爾表達式運算,用在if語句和循環中來測試控制語句執行的條件。下面的c++語句是and運算符的一個例子

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

圖3-16是and、or和xor在hol6層的真值表,它和圖3-15是一樣的,isa3層的1對應hol6層的true(真),isa3層的0對應hol6層的false(假)。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

由于不涉及進位,是以邏輯運算比加法更容易執行。對序列中的對應位進行遂位運算。邏輯運算對進位位和溢出位都沒有影響。

例3.19一些6位單元的例子是

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

注意,如果把1與1做and運算,結果是1,沒有進位。 □

每個and、or和xor運算用兩組位來産生結果,不過neg運算僅對一組位進行,是以稱為一進制運算(unary operation)。

3.3.2寄存器傳送語言

寄存器傳送語言(rtl)的目的是精确指定硬體操作的結果。如果學習過邏輯學,你會熟悉rtl符号。圖3-17展示了rtl符号。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

在邏輯學中,and和or運算稱為合取(conjunction)和析取(disjunction),not運算符稱為否定(negation)。蘊含(implies)運算符可以翻譯為英語“if/then”(中文“如果/那麼”)。傳遞(transfer)運算符是與c++中指派運算符=等效的硬體。運算符左邊的記憶體單元獲得運算符右邊的量。位索引運算符把記憶體單元當做數組,最左邊的位是索引0,與c++索引數組元素一樣。當形式化描述不夠時,可以用非形式化的語言描述,用大括号括起來。

有兩種分隔符:一個是順序分隔符(sequential separator)(分号),用來分隔一個接一個發生的兩個動作;另一個是并發分隔符(concurrent separator)(逗号)用來分隔同時發生的兩個動作。

例3.20在例3.19的第3個計算中,假設第一個6位單元用a表示,第二個6位單元用b表示,結果為c,那麼xor運算的rtl表述是

c←a⊕b; n←c<0, z←c=0

首先,c獲得a和b的異或,這個動作完成後,下面這兩個動作同時發生:n獲得一個布爾值,z獲得一個布爾值。當c<0時,布爾表達式c<0為1,否則為0。     □

3.3.3算術運算符

另外還有兩個一進制運算符:asl表示算術左移(arithmetic shift left)和asr表示算術右移(arithmetic shift right)。如同asl這個名字暗示的,單元中每位往左移動一個位置,最左邊的位移動到進位位,而最右邊的位得到0。圖3-18展示了一個6位單元的asl運算的動作。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

例3.21下面是3個算術左移的例子。

asl 11 1100=11 1000, n=1, z=0, v=0, c=1

asl 00 0011=00 0110, n=0, z=0, v=0, c=0

asl 01 0110=10 1100, n=1, z=0, v=1, c=0     □

這個運算稱為算術移位,因為當這些位用作整數表示時,它的結果類似于算術操作。假設用無符号二進制表示,前面例子中3個整數在移動前是

60 3 22 (dec,unsigned)

移動後成為

56 6 44 (dec,unsigned)

asl的結果是原數的2倍。因為120超出6位單元能表示的整數範圍,是以asl不能把60翻倍。當把二進制序列看作無符号整數時,如果移動後進位位是1,則發生溢出。

在十進制中,左移産生同樣的結果,隻是整數被乘以10而不是2。例如,對356進行十進制的asl會得到3560,它是原數值的10倍。

如果把數解釋為補碼表示會是什麼情況呢?那麼移動前3個整數是

-4322(dec,signed)

-86-20(dec,signed)

同樣,盡管是負數,asl的結果仍然是原數的2倍。這次,asl不能把22翻倍,假定用補碼表示,44超出了範圍。這個溢出情況使得v位被設定為1。這個情形與加法運算中c位檢測到無符号值溢出相似,需要用v位來檢測有符号值的溢出。

對6位單元r進行算術左移的rtl表述為

c←r<0>, r<0..4> ←r<1..5>, r<5>←0;

n← r<0, z←r = 0, v←{溢出}

同時,c獲得r最左邊的位,r最左邊的5位直接獲得它們緊鄰着的右邊位的值,最右邊一位獲得0。移位之後,根據r的新值設定狀态位n、z和v。區分分号和逗号是很重要的:分号隔開兩個事件,每個事件有3個部分;在每個部分内,逗号隔開同時發生的事件。大括号非形式化地表示當把值當作有符号整數時,根據結果是否溢出對v位進行設定。

在asr運算中,組中每個位往右移動一個位置,最低有效位移到進位位,最高有效位保持不變。圖3-19展示了一個6位單元的asr運算的動作。asr運算不會影響v位。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

例3.22下面是4個算術右移的例子。

asr 01 0100=00 1010,n=0, z=0, c=0

asr 01 0111=00 1011,n=0, z=0, c=1

asr 11 0010=11 1001,n=1, z=0, c=0

asr 11 0101=11 1010,n=1, z=0, c=1     □

asr運算是特意為補碼表示設計的,因為符号位保持不變,負數仍然是負數,正數仍然是正數。

往左移1位是原數乘以2,反之往右移1位是原數除以2。在前面例子中,移動前4個整數為

2023-14-11(dec,signed)

移動後是

1011-7-6(dec,signed)

偶數正好可以被2整除,是以asr對它們的結果沒什麼疑問。當奇數除以2時,結果總是向下取整。例如,23÷2=11.5,11.5向下取整為11,同樣,-11÷2=-5.5,-5.5向下取整為-6。注意,因為在數軸上-6在-5.5左邊,是以它小于-5.5。

3.3.4循環移位運算符

和算術運算符相比,循環移位運算符不會把二進制序列看作整數,是以循環移位運算不會影響n、z和v位,而隻會影響c位。有兩種循環移位運算符:表示為rol的循環左移和表示為ror循環右移。圖3-20展示了6位單元的循環移位運算符的動作。循環左移類似于算術左移,在循環左移中c位會循環移到單元的最右邊位,而在算數右移中是0。循環右移是在相反的方向做同樣的事情。

《計算機系統:核心概念及軟硬體實作(原書第4版)》——3.3 二進制運算

6位單元循環左移的rtl表述是

c←r〈0〉, r〈0..4〉 ←r〈1..5〉, r〈5〉←c;

例3.23下面是4個循環移位運算的例子。

c=1,rol 01 1101=11 1011,c=0

c=0,rol 01 1101=11 1010,c=0

c=1,ror 01 1101=10 1110,c=1

c=0,ror 01 1101=00 1110,c=1

左邊是循環移位前的c值,而右邊是循環移位後的c值。  □

繼續閱讀