計算機組成原理
計算機是如何工作的
| 認識計算機中的基本部件 | PC:程序計數器; |
| ---- | ---- | ---- |
| CPU:中央處理器; | MAR:存儲器地址寄存器 |
|ALU:算術邏輯部件;|IR:指令寄存器;|
|MDR:存儲器數據寄存器|GPRs:通用寄存器組(由若干通用寄存器組成,早期就是累加器)|
CPU:中央處理器; PC:程序計數器;
MAR:存儲器地址寄存器 ALU:算術邏輯部件;
IR:指令寄存器; MDR:存儲器數據寄存器
GPRs:通用寄存器組(由若干通用寄存器組成,早期就是累加器)
-
做菜之前
原材料,菜譜,架子,編號
原材料和菜譜都按照順序放在架子上並且有一定的編號
原材料(數據)和菜譜(指令)都按照順序放在架子(儲存器)上並且有一定的編號(儲存單元地址)
(菜譜的內容是包含原材料的位置,做法,做好了放在哪里)
-
開始做菜
第一步:從五號架子上面去菜譜(CPU 根據PC取指令)
第二步:查看菜譜(指令譯碼)
第三步:根據菜譜從何處取出原材料(根據指令取出操作數)
第四步:洗切炒具體操作(計算機在ALU上面進行具體操作,與,或,非)
第五步:裝盤或者是直接送桌(回寫出結果)
第六步:算出下一個菜譜所在的架子號6 = 5+1(修改PC的值)
-
程序在執行之前
數據和指令事先存放在存儲器中,每條指令和每個數據都有地址,指令按序存放,指令由OP、ADDR(OP是操作字段,ADDR是地址字段)字段組成,程序起始地址置PC(原材料和菜譜都放在廚房外的架子上,每個架子有編號。媽媽從第5個架上指定菜譜開始做)
-
開始執行程序
第一步∶根據PC取指令(從5號架上取菜譜)
第二步∶指令譯碼(看菜譜)
第三步:取操作數(從架上或盤中取原材料)
第四步:指令執行(洗、切、炒等具體操作)
第五步:回寫結果(裝盤或直接送桌)
第六步:修改PC的值(算出下一菜譜所在架子號6=5+1)
繼續執行下一條指令(繼續做下一道菜)
計算機的指令中需要給出的信息
操作性質(操作碼)
源操作數1,(源操作數2)
目的操作數地址
原碼和移碼的表示
-
什么是移碼表示?
將每一個數值將上一個偏置常數(Excess/ bias)
通常,當編碼位數為n的時候,bias取
-
機器里面的移碼表示也就是編碼表示
-
為什么使用移碼來表示指數(階碼)?
-
便於浮點數加減運算時對階的操作(比較大小)
-
小栗子:
取的運算的位數為3,所以移碼是2的3-1次方等於4
-
運算器的模運算
補碼的定義
X是真值,[x]補是機器數
在32位機器中:
int中機器數的位數是32位
char中的機器數的位數是8位
short的機器鼠的位數是16位
負數的補碼應該怎么求:各位取反,末尾加一
如何求補碼的真值
簡便的算法:
符號為0,則為正數,數值部分相同
符號為1,則為負數,各位取反末尾加一;數值從右向左遇到第一個1不變,然后各位取反
C語言里面的數值表示
C語言里面的整數
- 無符號數和帶符號數運算的時候都按照無符號數來運算
- 在c90和c99里面的符號數 和 無符號數的判斷界限不一樣,因此同一可能會產生不同的結果。
C語言里面的浮點數(IEEE754標准)
實數分為:單精度,雙精度,擴展雙精度 float double longdouble
C語言里面的科學計數法與浮點數
使用科學計數發,但是只有一種的是規格化的表示。
對於十進制的小數,可以使用科學計數法,同樣的,對於二進制的小數也可以使用科學計數法:
對於浮點數的表示方法:
由於規格化表示的原因,小數點之后的數字第一個總是1,所以省去這一位的表達,所以實現了使用23位表示24位的方法
- s是符號位
- E是階碼,通常使用移碼(加上
)來表示
- 尾數規格化顯示的定義是第一個數字為1,所以舍棄不予以顯示。
32位浮點表示規格化數的表示范圍。詳見csapp
非數值數據的編碼表示
-
西文字符的編碼表示:
需要掌握基本的字母和數字的ASCII碼表
-
漢字的編碼表示:
- 輸入碼:對漢子用相應的按鍵進行編碼表示
- 內碼:用於在系統中進行存儲,查找,傳送等處理
- 字模點陣或輪廓描述表述漢字字模點陣或輪廓,用於顯示/打印
數據寬度和存儲量位的單位
-
比特:(bit)位,是計算機處理,儲存,運輸的最小單位。
-
字節:二進制信息最基本的計量單位是”字節“Byte
- 一個二進制的Byte是8位
- 現代計算機中的儲存器都是按照字節編址
- 字節是最小的可尋址單位
- 如果字節排列,LSB是最低有效字節 Msb是最高的有效字節
-
字和字長:經常使用“字”作為單位
- 字和字長的概念不同。字是結構決定的
- 字長是數據通路的寬度
-
容量通常使用的單位有
- KB,MB,GB,TB
-
通信中的帶寬使用的單位有
- kb/s 1kbs = 1000bps
- Mb/s 1Mbps = 1000kbps
- Gb/s 1Gbs = 1000Mbps
- Tb/s 1Tbs = 1000Gbps
如果把b換成B表示的是字節而不是比特(位)
高級語言支持不同的類型和不同的長度的數據,而且相同類型的數據采用的寬度也不盡相同。
數據儲存和排列的順序
-
存儲的字節數:一個數據可能會占用多少個存儲單元
-
地址存放:變量的地址是最大地址還是最小地址
-
大端/小端存放:多個字節在存儲單元中存放的順序如何
-
小端方式:LSB 所在的地址是數據的最小地址
-
大端方式:MSB所在的地址是數據的最小地址
例如:一個int數據,占用了32位4的字節,把這四個字節分別記作100,101,102,103
在同一個系統之中,大端和小端是一定的,但是在網絡交互通信的時候,就需要做相應的更改。
-
邏輯“與或非” 和 電路之間的關系
或電路:
與電路:
非電路:
通過與或非的電路可以構建多有的電路邏輯
異或電路:
異或電路就可以使用這三種電路來進行構建
異或電路的簡單表達方式
根據電路是否有存儲的功能可以分為兩種
- 組合邏輯電路:沒有存儲功能,其輸出僅依賴與當前輸出
- 時序邏輯電路:具有存儲功能,其輸出不僅依賴與當前輸出,還依賴於存儲單元的當前狀態
可以利用基本的邏輯門電路構成一些具有特定功能的組合邏輯部件
- 譯碼器,編碼器,多路選擇器,加法器
實現一個功能部件的過程
- 得出真值表
- 通過真值表來確定邏輯表達式
- 根據邏輯表達式實現邏輯電路
加法器的實現
n位加法器可以通過n個加法器實現。
計算機的比較運算和減法運算
計算機的比較運算是通過減法運算組成的,但是計算機的所有運算都可以通過加法運算來構成。
帶標志的加法器。
n位整數的加、減運算器
-
在一個int運算里面,機器數表示都是補碼運算
-
補碼的運算公式:
-
因此在機器里面int的加減運算就可以表示為
-
各位取反,末尾加一:
-
-
在加減運算的公式下面可以得到如下結論
- 利用帶標志的加法運算器,可以構造出整數加減的運算器(帶不帶符號都可以)
- 為什么sub為1的時候做減法-------------------------------->各位取反,末尾加一
- sub作為2路控制器的同時,擔任了加法器cin進位,十分巧妙。
ALU的基礎就是n位正數的加減運算
- 核心電路:帶標志的加法器
- 基本的算術運算與邏輯運算
- 加減運算(帶符號,不帶符號)
- 以,或,非,異或等邏輯電路
- 多種操作,但是如何判斷結果的操作方法-—–>操作控制端
- ALUop是操作控制端,用來決定ALU所執行的處理功能,他的位數K 軍定了操作的種類,例如k為3的時候,就可以有最多2^3 = 8中操作
計算機是實現高級語言程序中的運算
-
將表達式編譯為指令序列
-
計算機直接執行指令來完成運算
- 控制器對指令進行姨媽,產生控制信號送到運算電路
-
操作數在運算電路中運算
數據的運算都是由邏輯門運算產生的。
高級程序運算-----》指令運算-----》電路運算
- 兩次轉換----電路到指令---指令到電路。
C語言中涉及到的運算
-
算術運算
- 加減乘除,浮點運算,有無符號的運算
-
按位運算
- 按位與, 按位或,按位取反,按位異或,吸取操作。
- 吸取操作
-
移位運算
- 擴大或縮小2,4,8…倍數。
- 邏輯移位
- 移位溢出:高位溢出的是1,則左移溢出
- 左移:高位移出,低位補零
- 右移:低位移出,高位補零
- 算術移位
- 移位溢出:移出前和移出后的符號為是否相等
- 左移:高位移出,低位補零
- 右移:低位移出,高位補零,可能會發生有效數據丟失。
-
邏輯運算
- 用於關系表達式的運算,例如 if,and ,else等
-
位擴展和位截斷運算
-
類型轉換的時候使用到的,沒有默認的運算符。
-
例如在類型轉換的時候,長的數據類型轉化成短的數據類型是位截斷運算,短的轉為長的是位擴展運算
-
擴展運算:有符號數擴展符號位,無符號數擴展0
-
截斷運算:截斷前面多余的位數。
-
-
C語言中加減運算器的實現
-
重要認識1:計算器中所有的運算電路的實現核心
-
重要認識2:加法器不知道運算的帶符號數還是無符號數
-
重要認識3:加法器不噴段錯,總是去低n位做結果,並產生標志信息
加法運算器的具體實現
標志寄存器的標志信息
-
ZF零標志:如SUM 為0的時候,ZF為1
-
OF溢出標志:若兩個加數同號但是SUM不同號則1;次高位進位和最高位進位進行異或
-
SF:表示sum的符號
-
CF:表示借位或是進位。
做減法以比較大小,規則:
Unsigned:CF=0時,大於
Signed:OF=SF時,大於
C語言中乘運算
如何判斷乘法運算是否溢出
-
高級語言里面,程序員直接使用(!x|x*y/x == y)判斷即可
-
帶符號運算:如果高位的數字和低n位的最高位相同的時候,沒有發生溢出
-
無符號運算:如果高n位全為0,那么沒有發生溢出。
因此帶符號乘和無符號乘是使用不同的指令進行的。
但是帶符號加和帶符號減是相同的指令進行的
- 證書的乘法運算時間 大於 整數的加法和移位運算時間長,因此一次乘法運算可以分解為移位運算和加運算、
除數的除運算
”朝零舍入“ 7/2 = 3 -7/3 = -3
a/-1和a/b,b=-1不一樣,前者可以被優化為取負運算。
- 取負指令的運算比較法咋,不能通過流水線的方式實現,一次處罰的運算時間大致需要30個時間鍾
- 不能乘除的情況
- 注意帶符號數的運算方式,因為帶符號數的運算需要先加上一個偏移量,然后在進行截斷
- 注意:k是運算時的右移位數
C語言浮點數的運算
-
加減運算
-
再階碼的運算當中要“對階”,也就是低階向高階轉化
-
規格化:當位數高位為0的時候有進位,需要左規MSB為1
當位數高位有進位的時候,需要右規直到MSB為1
-
-
乘除運算
-
階碼上溢
-
階碼下溢
-
為了防止數據的溢出,硬件會設置一些附加位以調高精度。IEEE754規定至少有兩位,一位是保護位,一位是舍入位。
C語言的舍入方式
- 就近舍入:舍入為最近可表示的數
- 01:舍棄
- 11:進位
- 10:強迫結果為正數
- 正向舍入
浮點數運算是發生的錯誤
- 除數為0的時候,得出的結果是無窮大,階碼位全是1,位數全為0符號位為0或1
- 浮點數的結合率是不符合的
機器極指令
-
機器指令和匯編指令是一一對應的,都是機器級指令。
-
機器指令是一個01序列,由若干個字段組成。
-
匯編指令是機器指令的符號表示(有不同的格式)
-
回顧一下GCC套件的執行順序
- == 預處理、編譯、匯編、鏈接 ==
-
使用objdump反匯編代碼的時候,機器數的地址不是實際的地址,是從0開始的地址。
-
他的長度是使用十六進制進行的
-
回顧一下ISA(指令集體系結構)
- ISA 是計算機中硬件的抽象,是一種軟件和硬件之間的接口。
所有指令的格式,功能
通用寄存器的個數,位數,編號和功能
儲存地址空間大小,編址方式,大、小端
指令尋址方式
Intel的體系結構概述
- 擁有八個通用寄存器GPRs和一個標志寄存器(通用寄存器都是成組出現的)
- 擁有一個PC 為EIP的計時器
- 可尋址的空間是4G 232 個字節,其他的指令都是可變長的
-
IA-32的寄存器的組織概覽
-
各個位數寄存器編號0~8
-
3個控制標志
-
df if tf
- 方向標志(自動變址方向)
- 中斷允許標志(僅對外不可屏蔽的中斷有效)
- 陷阱標志(是否單步跟蹤狀態)
IA32的尋址方式
-
尋址方式:
- 如何根據指令得到操作數的地址或操作數
-
操作數所在的位置
- 指令中 :立即尋址
- 寄存器中:寄存器尋址
- 存儲單元中:其它尋址方式
-
儲存器的操作數的尋址方式分為兩種
-
實地址模式(用不到)
-
保護模式(掌握)
-
加電以后采用虛擬儲存管理,多任務情況下隔離保護
-
尋址空間為 232B,32位線性地址
-
尋址方式十分復雜,這與寄存器的數據結構有關系。
-
儲存器的尋址方式(SIB)
按照一個C語言的變量聲明說明聲明方式:
windows里面double分配的地址必須是8的倍數。所以c以后空了一行多。
-
操作指令 操作長度, 基質(基址寄存器(%ebp) + 變址寄存器(%esi)+ 比例因子 ),移動目標
一個地址就是一個字節byte就是四個比特(b)就是4位。
IA-32常用的指令類型
例如數組a[i] [j]的尋址方式是需要基址寄存器和變址寄存器和比例因子。
機器指令格式的概覽:
其他的指令類型太過於復雜,不做記憶要求。
- 傳送常用運算常用指令
- 定點算術運算指令
ALU里面都有什么東西
- 補碼運算
- 實現帶符號運算
- 實現無符號運算
- 沒有乘法運算器(可以使用加法運算器實現)
- 沒有除法運算器
- 邏輯門的運算
IA-32 運算指令
- 加法運算指令
- 乘法運算指令
- 按位運算指令
- 控制轉移指令
……
C語言函數過程調用的機器級表示
過程調用的執行步驟:
- 調用函數將入口參數(實參)放到被調用函數能訪問到的地方
- 調用函數預先保存返回地址(壓棧),單后將控制轉移到被調用函數
- 被調用函數保存調用函數的現場(main函數通用寄存器的內容??),並且為自己的非靜態局部變量分配空間
- 執行被調用函數
- 被調用函數恢復調用函數的現場,釋放局部變量空間
- 取出返回地址,控制權轉移給調用函數。
為什么要保存現場?
因為所有的過程都共享用一套通用寄存器。
關於寄存器使用的約定
-
調用者P保存寄存器 : EAX,EDX,ECX
Q可以直接使用這三個寄存器
若P在從Q返回后還要用的話,P應在轉到Q之前先保存,並湊單從Q返回后先回復他們的值再使用。
-
被調用者Q保存寄存器:EBX ESI ,EDI
Q必須先將它們的只保存到棧中再使用他們,並在返回P之前恢復他們的值
-
EBP 和ESP分別是 幀指針寄存器和棧指針寄存器,分別用來指向當前棧幀的底部和頂部。
為了減少准備和結束階段的開銷,每個過程應先適用哪些寄存器? 調用者的寄存器