1. 程式人生 > >【計算機組成與設計:硬體/軟體介面】第三章:計算機的算術運算

【計算機組成與設計:硬體/軟體介面】第三章:計算機的算術運算

【計算機組成與設計:硬體/軟體介面】第三章:計算機的算術運算

標籤(空格分隔):【計算機組成與設計:硬體/軟體介面】


第三章:計算機的算術運算

3.1 引言

3.2 加法和減法

  • 對於二進位制補碼,什麼時候發生溢位?
    硬體規模總是有一定限制的,例如字寬只有32位。當運算超過這個限制,就會發生溢位。
    首先看什麼時候不會溢位。加法:當相加的兩個源運算元符號相異時,不會發生溢位
    ,因為二者的和必定不會大於其中的某一個運算元。若源運算元可以用32位表示,那麼這個結果也必然可以用32位表示。減法規則相反,當源運算元符號相同時,不會溢位。例如 c - a可以視為 c + (-a),此時與加法不會溢位時情況相同。
    何時發生溢位?當加法和減法之後的結果需要使用多餘32位表示時會發生溢位。例如,如果兩個正數相加但結果是負數,或者一個負數減去一個正數結果為正數,那麼必然發生了溢位。
    加減法發生溢位的條件:
    image.png-28.6kB
  • 對於無符號整數,由於無符號整數通常用於表示記憶體地址,這種情況下的溢位可以忽略。

  • MIPS 解決溢位的方法:

    1. add,addi,sub,這三條指令在溢位時產生異常。
    2. addu,addiu,subu,這三條指令在溢位時不會發生一場。
      由於C語言忽略溢位,因此 MIPS C編譯器總是採用無符號算術指令addu,addiu,subu,而不必考慮變數的型別。
  • 算術邏輯單元(arithmetic logic unit,ALU):用來執行加法、減法,通常也包括邏輯與、邏輯或等邏輯操作。

  • 異常:也叫中斷,一種打斷正常程式執行過程的事件,用於溢位檢測。
  • 中斷:來自處理器外部的異常。
  • 從本質上來說,異常或終端是一種打斷正常過程的系統呼叫,產生溢位的指令地址儲存在一個暫存器中,而後計算機會跳轉到一個預先設定好的地址取執行相應的異常處理程式。儲存異常地址的目的是為了在某些條件下能夠在異常處理程式執行完畢之後返回源程式繼續執行。
  • 飽和(saturating)操作是通用微處理器中一個出場出現的特性,它意味著當計算結果溢位時,結果被設定為最大的整數或者最小的負數,而不像二進位制補碼運算那樣採用取模操作來獲得結果。注意,飽和操作更適合多媒體操作。

3.3乘法

  • 乘法操作中,被乘數(multiplicand):第一個源運算元,乘數(multiplier):第二個源運算元,積(product):最終結果。一般而言,積的位數遠遠大於被乘數和乘數。事實上,在忽略符號位的情況下,積的位數等於乘數的位數與被乘數的位數。因此,乘數也需要考慮溢位的情況。

3.3.1 順序的乘法演算法和硬體

  • 假設源運算元僅僅是正數。下圖給出了硬體結構。
    image.png-89.6kB
    對於運算元的每一位的三個基本執行步驟:乘數的最低為(乘數的第0 位)決定了成功倍數是否被加到積暫存器上。第二步中的左移起著將被乘數左移的作用。第三部鍾後的有一給出了下一個迭代中要使用的乘數位。這三個步驟重複執行32次才獲得積。假設每個步驟花費一個時鐘週期,那麼100個時鐘週期才可以完成兩個32位數的相乘。

    以上演算法很容易得到優化:當乘數位為1時,將乘數和被乘數進行移位,同時將被乘數和積相加。這樣一來每一步只需要一個時鐘週期。
    image.png-84.5kB

3.3.2 有符號乘法

  • 如何處理有符號乘法,最簡單的方法是首先將被乘數和乘數轉換為整數,並記錄原先的符號位。

3.3.3 更快的乘法

  • 思想:在乘法運算開始的時候通過檢查乘數的32位,來判定被乘數是否被加上,快速的乘法運算的主要思想是為乘數的每一位提供一個32位加法器,一個用來輸入被乘數和一乘數位相與的結果,另一個是上一個加法器的輸出。
  • 方法:
    s.PNG-154.5kB

3.3.4 MIPS中的乘法

  • 一對單獨的32位暫存器來容納64位的積,分貝是Hi和Lo。
  • 為了產生正確的有符號積和無符號積,MIPS提供了兩條指令:mult 和 multu.
  • 為了取得32位的整數積,通常使用mflo指令。

3.3.5 小結

  • 乘法運算指示簡單的移位和加法。

3.4 除法

  • 在除法的操作中,兩個源運算元被稱為被除數(dividend)和除數(divisor),結果為 商(quotient),第二個結果為 餘數(remainder).它們之間的關係可以表示為 = + 其中餘數小於除數。

3.4.1 除法演算法及其硬體結構

  • 開始時,32位的商暫存器設為 0,演算法每次的迭代將除數向右移一位,所以開始時將除數放置在64為除數暫存器的左半邊,然後每次右移一位來和被除數對齊。玉樹暫存器初始化為被除數。
    image.png-117.2kB

3.5 浮點運算

    1. 科學記數法(scientific notation):十進位制小數點左邊只有一位整數的計數法。
    2. 規格化數(normalized):沒有前導零的浮點計數法。
    3. 浮點數(floating point):二進位制小數點不固定的表達數的計數法。
  • 對實數採用規格化形式的標準科學技術法的三個優點:1. 簡化了浮點數的資料交換,2. 簡化了浮點算術演算法,3. 提高了可一個字儲存的數的精度。

3.5.1 浮點表示

  • 尾數(fraction):位於浮點數和尾數字段,其值在 0 和 1 之間。
  • 指數(exponent):位於浮點數的指數字段,表示小數點的位置。
  • 考慮到字的大小是固定的,浮點表示的設計者必須在尾數位寬和指數位寬之間找出折中的辦法。浮點數通常是多個字的寬度,MIPS中,s為浮點數的符號(1表示負數),指數域為8位寬(包括指數的符號位),尾數域為23位寬,這種表示成為符號和數值(sign and magnitude), 因為符號和數值的位置是相互分離的。
    image.png-19.2kB
    一般浮點數的表示形式: ( 1 ) S F 2 E 其中F為小數域的值,E為指數域的值。
    浮點表示法使得MIPS計算機有很大的數值表示範圍,小到 2.0 10 10 38 ,大到 2.0 10 10 38 ,但請注意,它和無窮是不同的。也會存在一些數字因為太大而不能表示。溢位依舊會發生。
  • 上溢(overflow):正的指數太大而導致指數域放不下的情況。
  • 下溢(underflow)):負的指數太大而導致指數域放不下的情況。
  • 一種減少上溢和下溢的方法:採用更達的指數格式。C語言中成為double,基於double的操作成為雙精度(double precision)浮點算術,指的是浮點數由兩個32位的字表示。單精度(single precision)浮點就是前面的格式,指的是浮點數由一個32位的字表示。

  • IEEE 754 浮點標準:
    雙精度浮點數佔用了兩個MIPS字,如下所示。其中,s表示符號,指數域為11位,尾數與為52位。
    1.PNG-18.3kB
    MIPS雙精度的表示範圍小到 2.0 10 10 308 ,大到 2.0 10 10 308 .它的主要的優勢還是通過提供更多的有效位數來實現更達的表示精度。
    包括前面單精度浮點數,也是IEEE 754 浮點標準的一部分。

  • 為了將更多的資料為打包到有效位數(significand)部分,IEEE 754 標註甚至隱藏了規格化二進位制數的前導位 1 .
    因此,在單精度浮點數下,數有24位寬(隱含的規格化二進位制數的前導位1和23位尾數);在雙精度的情況下,數有523位寬(1+52)。為了精確,我們用術語有效位數來表示24位或者53位的數,就是隱含1加上位數。
    因為 0 沒有前導位 1 ,它的指數保留為0,所以硬體就不會將前導位1 加到尾數上。其餘的數使用前面的形式 ( 1 ) S ( 1 + F ) 2 E 其中F為 0 和 1 之間的數。
    準確而言是 ( 1 ) S ( 1 + ( s 1 2 1 ) + ( s 2 2 2 ) + . . . ) 2 E
    image.png-29.9kB
    其中,無窮用來處理 除0中斷;非數字用來推遲程式中的一些測試和決定。
  • 為什麼符號位放在最前面?因為 IEEE 754的設計者希望浮點能夠比較快速地處理整數比較。
  • 為什麼將指數放在有效位數前?因為這樣可以簡化用整數比較指令來處理地浮點數分類,有著相同符號的情況下,指數越大數值越大。

  • 帶偏階的計數法(biased notation):在IEEE 754中單精度的偏階為 127,雙精度的指數偏階為 1023。帶上偏階之後,浮點數的表示為:

    ( 1 ) S ( 1 + F ) 2   ( E x p o n e n t B i a s )

3.5.2 浮點加法

1.PNG-265.8kB

  • 為了說明浮點加法的問題,我們將兩個採用科學記數法的數字相加: 9.999 10 10 1 + 1.610 10 10 1 ,假設我們只能儲存 4 個十進位制有效數字和兩個十進位制指數。
    步驟:

    1. 為了能讓兩個數字相加,我們必須將有較小指數的數指向有較大指數的數字。
      1.610 10 10 1 = 0.01610 10 10 1 ,由於只能表示4 位十進位制數,所以需要移位,最終結果為 0.016 10 10 1 .
    2. 將有效數相加: 9.999 10 + 0.016 10 = 10.015 10 .
    3. 因為和不是規格化科學記數形式,因此需要規格化,即 1.0015 10 10 2 .
    4. 由於有效數只有 4位十進位制數那麼長(不包括符號位),所以我們需要進行舍入,依照四捨五入法則,有 1.002 10 10 2
  • 浮點加的基本結構:
    image.png-207.7kB

3.5.3 浮點乘法

我的微信公眾號