計算機組成原理


計算機組成原理

計算機是如何工作的

| 認識計算機中的基本部件 | PC:程序計數器; |
| ---- | ---- | ---- |
| CPU:中央處理器; | MAR:存儲器地址寄存器 |
|ALU:算術邏輯部件;|IR:指令寄存器;|
|MDR:存儲器數據寄存器|GPRs:通用寄存器組(由若干通用寄存器組成,早期就是累加器)|

image-20210903165557351

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取image-20210903170900668

  • 機器里面的移碼表示也就是編碼表示

  • 為什么使用移碼來表示指數(階碼)?

    • 便於浮點數加減運算時對階的操作(比較大小)

    • 小栗子:image-20210903165622496

      取的運算的位數為3,所以移碼是2的3-1次方等於4

運算器的模運算

補碼的定義

image-20210903165648483

X是真值,[x]補是機器數

在32位機器中:

int中機器數的位數是32位

char中的機器數的位數是8位

short的機器鼠的位數是16位

負數的補碼應該怎么求:各位取反,末尾加一

image-20210903165712107

如何求補碼的真值

image-20210903165723173

簡便的算法:

​ 符號為0,則為正數,數值部分相同

​ 符號為1,則為負數,各位取反末尾加一;數值從右向左遇到第一個1不變,然后各位取反

C語言里面的數值表示

C語言里面的整數

  • 無符號數和帶符號數運算的時候都按照無符號數來運算
  • 在c90和c99里面的符號數 和 無符號數的判斷界限不一樣,因此同一可能會產生不同的結果。

C語言里面的浮點數(IEEE754標准)

實數分為:單精度,雙精度,擴展雙精度 float double longdouble

C語言里面的科學計數法與浮點數

使用科學計數發,但是只有一種的是規格化的表示。

對於十進制的小數,可以使用科學計數法,同樣的,對於二進制的小數也可以使用科學計數法:

image-20210903165740297

對於浮點數的表示方法:

image-20210903165800109

由於規格化表示的原因,小數點之后的數字第一個總是1,所以省去這一位的表達,所以實現了使用23位表示24位的方法

  • s是符號位
  • E是階碼,通常使用移碼(加上image-20210903165824242 )來表示
  • 尾數規格化顯示的定義是第一個數字為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

      在同一個系統之中,大端和小端是一定的,但是在網絡交互通信的時候,就需要做相應的更改。

邏輯“與或非” 和 電路之間的關系

或電路:image-20210903165840368

與電路:image-20210903165911077

非電路:image-20210903165922536

通過與或非的電路可以構建多有的電路邏輯

異或電路:image-20210903165935772

異或電路就可以使用這三種電路來進行構建

異或電路的簡單表達方式image-20210903165948845

根據電路是否有存儲的功能可以分為兩種

  • 組合邏輯電路:沒有存儲功能,其輸出僅依賴與當前輸出
  • 時序邏輯電路:具有存儲功能,其輸出不僅依賴與當前輸出,還依賴於存儲單元的當前狀態
可以利用基本的邏輯門電路構成一些具有特定功能的組合邏輯部件
  • 譯碼器,編碼器,多路選擇器,加法器
實現一個功能部件的過程
  1. 得出真值表
  2. 通過真值表來確定邏輯表達式
  3. 根據邏輯表達式實現邏輯電路
加法器的實現
n位加法器可以通過n個加法器實現。
計算機的比較運算和減法運算

計算機的比較運算是通過減法運算組成的,但是計算機的所有運算都可以通過加法運算來構成。

帶標志的加法器。

n位整數的加、減運算器

  • 在一個int運算里面,機器數表示都是補碼運算

  • 補碼的運算公式:image-20210903170005346

    • 因此在機器里面int的加減運算就可以表示為image-20210903170024966

      image-20210903170041838

    • 各位取反,末尾加一:image-20210903170053490

  • 在加減運算的公式下面可以得到如下結論

    • 利用帶標志的加法運算器,可以構造出整數加減的運算器(帶不帶符號都可以)
    • image-20210903170111460
    • 為什么sub為1的時候做減法-------------------------------->各位取反,末尾加一
    • sub作為2路控制器的同時,擔任了加法器cin進位,十分巧妙。

ALU的基礎就是n位正數的加減運算

  • 核心電路:帶標志的加法器
  • 基本的算術運算與邏輯運算
    • 加減運算(帶符號,不帶符號)
    • 以,或,非,異或等邏輯電路
  • 多種操作,但是如何判斷結果的操作方法-—–>操作控制端
  • ALUop是操作控制端,用來決定ALU所執行的處理功能,他的位數K 軍定了操作的種類,例如k為3的時候,就可以有最多2^3 = 8中操作

計算機是實現高級語言程序中的運算

  • 將表達式編譯為指令序列

  • 計算機直接執行指令來完成運算

    • 控制器對指令進行姨媽,產生控制信號送到運算電路
  • 操作數在運算電路中運算

    數據的運算都是由邏輯門運算產生的。

高級程序運算-----》指令運算-----》電路運算

  • 兩次轉換----電路到指令---指令到電路。

C語言中涉及到的運算

  • 算術運算

    • 加減乘除,浮點運算,有無符號的運算
  • 按位運算

    • 按位與, 按位或,按位取反,按位異或,吸取操作。
    • 吸取操作image-20210903170126521
  • 移位運算

    • 擴大或縮小2,4,8…倍數。
    • 邏輯移位
      • 移位溢出:高位溢出的是1,則左移溢出
      • 左移:高位移出,低位補零
      • 右移:低位移出,高位補零
    • 算術移位
      • 移位溢出:移出前和移出后的符號為是否相等
      • 左移:高位移出,低位補零
      • 右移:低位移出,高位補零,可能會發生有效數據丟失。
  • 邏輯運算

    • 用於關系表達式的運算,例如 if,and ,else等
  • 位擴展和位截斷運算

    • 類型轉換的時候使用到的,沒有默認的運算符。

    • 例如在類型轉換的時候,長的數據類型轉化成短的數據類型是位截斷運算,短的轉為長的是位擴展運算

      • 擴展運算:有符號數擴展符號位,無符號數擴展0

      • 截斷運算:截斷前面多余的位數。

C語言中加減運算器的實現

  • 重要認識1:計算器中所有的運算電路的實現核心

  • 重要認識2:加法器不知道運算的帶符號數還是無符號數

  • 重要認識3:加法器不噴段錯,總是去低n位做結果,並產生標志信息

    加法運算器的具體實現image-20210903170136177

    標志寄存器的標志信息
  • 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是運算時的右移位數image-20210903170157233

C語言浮點數的運算

  • 加減運算

    • 再階碼的運算當中要“對階”,也就是低階向高階轉化

    • 規格化:當位數高位為0的時候有進位,需要左規MSB為1

      ​ 當位數高位有進位的時候,需要右規直到MSB為1

  • 乘除運算

  • 階碼上溢

  • 階碼下溢

  • 為了防止數據的溢出,硬件會設置一些附加位以調高精度。IEEE754規定至少有兩位,一位是保護位,一位是舍入位。

C語言的舍入方式

  1. 就近舍入:舍入為最近可表示的數
    • 01:舍棄
    • 11:進位
    • 10:強迫結果為正數
  2. 正向舍入
浮點數運算是發生的錯誤
  • 除數為0的時候,得出的結果是無窮大,階碼位全是1,位數全為0符號位為0或1
  • 浮點數的結合率是不符合的

機器極指令

  • 機器指令和匯編指令是一一對應的,都是機器級指令。

  • 機器指令是一個01序列,由若干個字段組成。

    image-20210903170206084

  • 匯編指令是機器指令的符號表示(有不同的格式)

  • 回顧一下GCC套件的執行順序

    • == 預處理、編譯、匯編、鏈接 ==

    image-20210903170215773

    • 使用objdump反匯編代碼的時候,機器數的地址不是實際的地址,是從0開始的地址。

    • 他的長度是使用十六進制進行的

  • 回顧一下ISA(指令集體系結構)

    • ISA 是計算機中硬件的抽象,是一種軟件和硬件之間的接口。

    image-20210903170224053

    所有指令的格式,功能

    通用寄存器的個數,位數,編號和功能

    儲存地址空間大小,編址方式,大、小端

    指令尋址方式

Intel的體系結構概述

  1. 擁有八個通用寄存器GPRs和一個標志寄存器(通用寄存器都是成組出現的)
  2. 擁有一個PC 為EIP的計時器
  3. 可尋址的空間是4G 232 個字節,其他的指令都是可變長的
  • IA-32的寄存器的組織概覽

    image-20210903170450406

  • 各個位數寄存器編號0~8

  • 3個控制標志

  • df if tf

    • 方向標志(自動變址方向)
    • 中斷允許標志(僅對外不可屏蔽的中斷有效)
    • 陷阱標志(是否單步跟蹤狀態)

IA32的尋址方式

  • 尋址方式:

    • 如何根據指令得到操作數的地址或操作數
  • 操作數所在的位置

    • 指令中 :立即尋址
    • 寄存器中:寄存器尋址
    • 存儲單元中:其它尋址方式
  • 儲存器的操作數的尋址方式分為兩種

    • 實地址模式(用不到)

    • 保護模式(掌握)

      • 加電以后采用虛擬儲存管理,多任務情況下隔離保護

      • 尋址空間為 232B,32位線性地址

      • 尋址方式十分復雜,這與寄存器的數據結構有關系。

        image-20210903170532319

    儲存器的尋址方式(SIB)

    按照一個C語言的變量聲明說明聲明方式:

    image-20210903170541417

    ​ windows里面double分配的地址必須是8的倍數。所以c以后空了一行多。

image-20210903170628488

操作指令 操作長度, 基質(基址寄存器(%ebp) + 變址寄存器(%esi)+ 比例因子 ),移動目標

image-20210903170641189

​ 一個地址就是一個字節byte就是四個比特(b)就是4位。

IA-32常用的指令類型

​ 例如數組a[i] [j]的尋址方式是需要基址寄存器和變址寄存器和比例因子。

機器指令格式的概覽:

image-20210903170650612

其他的指令類型太過於復雜,不做記憶要求。

  1. 傳送常用運算常用指令
  2. 定點算術運算指令

ALU里面都有什么東西

  • 補碼運算
    • 實現帶符號運算
    • 實現無符號運算
  • 沒有乘法運算器(可以使用加法運算器實現)
  • 沒有除法運算器
  • 邏輯門的運算
IA-32 運算指令
  1. 加法運算指令
  2. 乘法運算指令
  3. 按位運算指令
  4. 控制轉移指令

……

C語言函數過程調用的機器級表示

過程調用的執行步驟:
  1. 調用函數將入口參數(實參)放到被調用函數能訪問到的地方
  2. 調用函數預先保存返回地址(壓棧),單后將控制轉移到被調用函數
  3. 被調用函數保存調用函數的現場(main函數通用寄存器的內容??),並且為自己的非靜態局部變量分配空間
  4. 執行被調用函數
  5. 被調用函數恢復調用函數的現場,釋放局部變量空間
  6. 取出返回地址,控制權轉移給調用函數。

為什么要保存現場?

因為所有的過程都共享用一套通用寄存器。

關於寄存器使用的約定
  • 調用者P保存寄存器 : EAX,EDX,ECX

    Q可以直接使用這三個寄存器

    若P在從Q返回后還要用的話,P應在轉到Q之前先保存,並湊單從Q返回后先回復他們的值再使用。

  • 被調用者Q保存寄存器:EBX ESI ,EDI

    Q必須先將它們的只保存到棧中再使用他們,並在返回P之前恢復他們的值

  • EBP 和ESP分別是 幀指針寄存器和棧指針寄存器,分別用來指向當前棧幀的底部和頂部。

為了減少准備和結束階段的開銷,每個過程應先適用哪些寄存器? 調用者的寄存器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM