3. 運算電路基礎

3.1 數字邏輯電路基礎

1. 布爾代數

  • 0和1分別代表邏輯值“假”和“真”
  • 最基本的邏輯運算有:
與(AND) 或(OR) 非(NOT)
“ • ” ( “ ∧” ) “ + ” ( “ ∨ ” ) “ ¯ ” ( “ ﹁ ” )

任何一種邏輯表達式都可寫成 這三種基本運算的邏輯組合

例如,異或(XOR)運算的 邏輯表達式爲: AB=AB+ABA⊕B=A• \overline B+\overline A•B,異或運算也稱不等價運算。

2. 門電路

(1)一位邏輯門電路

  • 三種基本門電路:與門、或門、非門
  • 其他門電路可以由三種基本門電路組合形成(如異或門電路)
    在這裏插入圖片描述

(2)n位邏輯門電路

在這裏插入圖片描述

(3)組合邏輯部件

  • 根據電路是否具有存儲功能,將邏輯電路劃分爲兩種類型
     –組合邏輯電路:沒有存儲功能,其輸出僅依賴於當前輸入
     –時序邏輯電路:具有存儲功能,其輸出不僅依賴於當前輸入 ,還依賴於存儲單元的當前狀態
  • 可以利用基本邏輯門電路構成一些具有特定功能的組合邏輯部件 (功能部件)
     –如譯碼器、編碼器、多路選擇器、加法器等
  • 實現一個功能部件的過程 (邏輯函數的化簡
     ①用一個真值表描述功能部件的輸入和輸出之間的關係
     ②根據真值表確定邏輯表達式
     ③根據邏輯表達式實現邏輯電路

3. 組合邏輯部件

(1)多路選擇器

最簡單的多路選擇器(MUX)是二路選擇器
 – 有兩個輸入端A和B,一個輸出端F,並有一個控制端S,
 – 其功能是 :當S爲0時,F=A;當S爲1時,F=B。

k路選擇器應有k路輸入,因而控制端S的位數應是「log2k」
 – 例如,三路或4路選擇器,S有兩位;5~8路選擇器,S有3位。

在這裏插入圖片描述

(2)一位加法器(全加器)

一位加法器稱爲全加器
 – 兩個加數爲AB
 – 低位進位爲Cin
 – 和爲F
 – 向高位的進位爲Cout

化簡後,邏輯表達式如下:
F=ABCinCout=AB+ACin+BCinF=A⊕B⊕Cin\\Cout=A •B+A •Cin+B •Cin
在這裏插入圖片描述

(3)n位加法器

  • n位加法器可用n個全加器實現
    在這裏插入圖片描述 22圖片描述
    加法由邏輯部件實現,而其他所有算術運算部件都基於加法器 和邏輯運算實現,因此,所有算術運算是基於0和1以及邏輯運算實現的!

(4)n位帶標誌加法器

  • n位加法器無法用於兩個n位帶符號整數 (補碼)相加,無法判斷是否溢出
  • 程序中經常需要比較大小,通過(在加法器中)做減法得到的標誌信息來判斷

在這裏插入圖片描述 在這裏插入圖片描述
OFOF=CnCn1SFSF=Fn1ZF:ZF=1F=0/CFCF=CoutCin溢出標誌OF: OF=Cn⊕Cn-1 \\ 符號標誌SF: SF=Fn-1 \\ 零標誌ZF: ZF=1當且僅 當F=0;\\ 進位/借位標誌CF: CF=Cout⊕Cin

(5)n位整數加/減運算器

  • 利用帶標誌加法器,可構造整數加/減運算器,進行以下運算:
     - 無符號整數加、減
     - 帶符號整數加、減
    在這裏插入圖片描述
    在整數加/減運算部件 基礎上,加上寄存器、 移位器以及控制邏輯, 就可實現ALU、乘/除運算以及浮點運算電路

(6)算術邏輯部件(ALU)

  • 進行基本算術運算與邏輯運算 – 無符號整數加、減
     – 帶符號整數加、減
     – 與、或、非、異或等邏輯運算
  • 核心電路是帶標誌加法器
  • 輸出除和/差等,還有標誌信息
  • 有一個操作控制端(ALUop), 用來決定ALU所執行的處理功能。 ALUop的位數k決定了操作的種類 ,例如,當位數k爲3時,ALU最 多隻有23=8種操作。
    在這裏插入圖片描述
    在這裏插入圖片描述

3.2 從C表達式到邏輯電路

以賦值語句 y=(x>>2)+k 爲例

1. 從C表達式到運算類指令

C語言程序中的基本數據類型、基本運算類型
(1)基本數據類型
   ①無符號數(二進制位串)、帶符號整數(補碼)
   ②浮點數(IEEE 754標準)
   ③位串、字符(串)(ASCII碼)
(2)基本運算類型
   ①算術(+ -* / % > < >= <= == !=)
   ②按位( | & ~ ^)
   ③邏輯( || && !)
   ④移位( << >>)
   ⑤擴展和截斷

2. 從運算類指令到運算電路

(1)將各類表達式編譯(轉換)爲指令序列
  例如:y=(x>>2)+k 轉換爲以下指令序列:
     sarw $2, %ax ;       x>>2
    addw %bx, %ax ;   (x>>2) + k
(2)計算機直接執行指令來完成運算
    控制器對指令進行譯碼,產生控制信號送運算電路
(3)操作數在運算電路中運算
    sarw $2, %ax:將操作數“2”和“R[ax]”送移位器運算
    ddw %bx, %ax:將R[ax]和R[bx]送整數加減器中運算
移位器和整數加減運算器都是由邏輯門電路構成的!

3. 數據的運算

(1)高級語言程序中涉及的運算(以C語言爲例)
   – 整數算術運算、浮點數算術運算
   – 按位、邏輯、移位、位擴展和位截斷等運算
(2)指令集中涉及到的運算
    – 涉及到的定點數運算
    •算術運算
     帶符號整數:取負/ 符號擴展/ 加/ 減/ 乘/ 除 / 算術移位
     無符號整數:0擴展/ 加/ 減/ 乘/ 除/ 邏輯左移/ 邏輯右移
     •邏輯運算
     邏輯操作:與/ 或/ 非/ …
    – 涉及到的浮點數運算:加、減、乘、除
(3)指令中的運算操作在運算電路中進行
   – 基本運算部件ALU、通用寄存器組,以及其他部件

3.3 C語言中的各類運算

1. C語言程序中涉及的運算

(1)算術運算(最基本的運算)

  • 無符號數、帶符號整數、浮點數的+、-、*、/ 、%運算等

(2)按位運算

–用途
  • 對位串實現“掩碼”(mask)操作或相應的其他處理 (主要用於對多媒體數據或狀態/控制信息進行處理)
–操作
  • 按位或:“|”
  • 按位與:“&”
  • 按位取反:“~”
  • 按位異或:“^”

Q:如何從數據y中提取低位字節,並使高字節爲0?

A: 可用“&”實現“掩碼”操作:y & 0x00FF
例如,當y=0x0B2C時,得到結果爲:0x002C

(3)移位運算

–用途
   • 提取部分信息
   • 擴大或縮小2、4、8…倍
–操作
   • 左移::x<<k; 右移:x>>k

從運算符無法區分邏輯移位還是算術移位,由x的類型確定

  • 若x爲無符號數:邏輯左(右)移 高(低)位移出,低(高)位補0,可能溢出!
    Q: 何時可能發生溢出?如何判斷溢出?
    A: 若高位移出的是1,則左移時發生溢出
  • 若x爲帶符號整數:算術左移、算術右移
    左移: 高位移出,低位補0。可能溢出!
    溢出判斷: 若移出的位不等於新的符號位,則溢出
    右移: 低位移出,高位補符,可能發生有效數據丟失
  • 移位運算和按位運算舉例

Q: 對於一個 n ( n ≥8)位的變量 x ,請根據C語言中按位運算的定義, 寫出滿足下列要求的C語言表達式。
(1) x 的最高有效字節不變,其餘各位全變爲0。
(2) x 的最低有效字節不變,其餘各位全變爲0。
(3) x 的最低有效字節全變爲0,其餘各位取反。
(4) x 的最低有效字節全變1,其餘各位不變。
A:

(1)(x>>(n-8))<<(n-8)
(2)x & 0xFF
(3)((x^ ~0xFF) >>8 )<< 8
(4)x | 0xFF

(4)邏輯運算

–用途
   • 用於關係表達式的運算
   例如,if (x>y andi<100)then ……中的“and”運算
–操作
   • “‖”表示“OR”運算
   • “&&”表示“AND”運算 例如,if ((x>y) &&(i<100)) then ……
   • “!”表示“NOT”運算
–與按位運算的差別
    • 符號表示不同:& ~ && ;| ~ ‖;……
   • 運算過程不同:按位~ 整體
   • 結果類型不同:位串~ 邏輯值

(5)位擴展和位截斷運算

–用途
   • 類型轉換時可能需要數據擴展或截斷
–操作
   • 沒有專門操作運算符,根據類型轉換前、後數據長短確定是擴展還是截斷
   • 擴展:短轉長
     無符號數:0擴展(前面補0)
     帶符號整數:符號擴展(前面補符)
   • 截斷:長轉短,強行將高位丟棄,故可能發生“溢出”

例1(擴展操作): 在大端機上輸出si, usi, i, ui的十進制和十六進制值是什麼?
   short si = -32768;
   unsigned short usi = si;
   int i = si;
   unsingned ui = usi ;
A:
   si = -32768 8000 H
   usi = 32768 8000H
   i = -32768 FFFF 8000H
帶符號整數:符號擴展
   ui = 32768 0000 8000H 無符號整數:0擴展

例2(截斷操作):i 和j 是否相等?
   int i = 32768;
   short si = (short) i;
   int j = si;
A:
   不相等!
   i = 32768 0000 8000 H
   si = -32768 8000H
   j = -32768 FFFF 8000H
原因:對i截斷時發生了“溢出”,即:32768截斷爲16位數時, 因其超出16位能表示的最大值,故無法截斷爲正確的16位數!

3.4 整數加減運算

1. 整數加、減運算

  • C語言程序中的整數有
      –帶符號整數,如char、short、int、long型等
      –無符號整數,如unsigned char、unsigned short、 unsigned等
  • 指針、地址等通常被說明爲無符號整數,因而在進行指針或地址運算時,需要進行無符號整數的加、減運算
  • 無符號整數和帶符號整數的加、減運算電路完全一樣,這個運算電路稱爲整數加減運算部件,基於帶標誌加法器實現
  • 計算機中的加法器,因爲只有n位,所以是一種模2n運算系統

2. 整數加減運算部件

(1)補碼加減運算要點和運算部件

  • 加、減法運算統一採用加法來處理
  • 符號位(最高有效位MSB)和數值位一起參與運算
  • 直接用Adder實現兩個數的加運算(模運算系統) 運算結果高位丟棄,保留低n位,相當於取模2n
  • 實現減法的主要工作在於:求[–B] 補 ,[B]=B+1[–B] 補=\overline B+1

(2)所有運算電路的核心——加法器

  • 計算機中所有運算都基於加法器實現
  • 加法器不知道所運算的是帶符號數還是無符號數。
  • 加法器不判定對錯,總是取低n位作爲結果,並生成標誌信息。
    在這裏插入圖片描述

①零標誌ZF、溢出標誌OF、進/借位標誌CF、符號標誌SF稱爲條件標誌

標誌 計算
OF (帶符號數運算)若A與B’同號但與Sum不同號,則1;否則0
SF sum符號
ZF 如Sum爲0,則1,否則0。
CF Cout ⊕ sub

②存放標誌的寄存器通常稱爲程序/狀態字寄存器標誌寄存器。每個標誌對應標誌寄存器中的一個標誌位。 如,IA-32中的EFLAGS寄存器。
③生成並保存的條件標誌,在分支指令(條件轉移指令)中被用作是否轉移執行的條件

3. 整數加法舉例

在這裏插入圖片描述
在這裏插入圖片描述

4. 整數減法舉例

在這裏插入圖片描述
在這裏插入圖片描述

5. 溢出判斷

無符號 帶符號
溢出 進位CF = 1 OF = 1
溢出 差爲負數,即借位CF = 1 (1) 最高位和次高位的進位不同 Cn⊕Cn-1
(2) 和的符號位和加數的符號位不同

(1)無符號整數加法溢出判斷程序

在這裏插入圖片描述

發生溢出時,一定滿足result&lt;xresult&lt;x and result&lt;yresult&lt;y
否則,若 x+y2nxx+y-2^n≥x,則 y2ny≥2^n ,這是不可能的

/* Determine whether arguments can be added without overflow */ 
	int uadd_ok(unsigned x, unsigned y) 
	{ 
		unsigned sum = x+y;
		return sum >= x;
	}

(2)帶符號整數加法溢出判斷程序

在這裏插入圖片描述

當兩個加數異號,和不會出現溢出;
當兩個加數同號,且和與加數符號相反時,出現溢出。

/* Determine whether arguments can be added without overflow */ 
int tadd_ok(int x, int y) 
{
	  int sum = x+y;
	  int neg_over = x < 0 && y < 0 && sum >= 0; //負溢出
	  int pos_over = x >= 0 && y >= 0 && sum < 0; //正溢出
	  return !neg_over && !pos_over;
} 

(3)帶符號整數減法溢出判斷程序

在這裏插入圖片描述
如果直接調用上面的 tadd_ok(x, -y),當x=0,y=0x80000000時,會出現函數判斷錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章