1. 程式人生 > >CPU內部實現“加,減,乘,除”過程

CPU內部實現“加,減,乘,除”過程

本篇文章獎給大家解釋CPU內部是怎樣進行加減乘除的!

加法運算過程:
十進位制:
1+1=2
二進位制
01+01=10
實現過程:

在做加法時CPU內部會呼叫加法器,實際上加法運算器所做的工作就是按位與操作和進位運算!所謂的進位運算規則和十進位制一樣滿10進一而二進位制就是滿2進1,01&01=01,由於兩個二進位制位上的數相加等於2符合滿二進一的規則則向前一位進一:10 整數的補碼就是本身所以不需要補碼。

減法運算過程:
在說一下減法運算
十進位制:
5-2=3
二進位制:
0101-0010=011

實現過程:
在做減法時要先將減數轉換成負數然後補碼,在進行與運算然後進位補碼!
先將010轉換負數原碼 轉換過程如下:
先取反(包括符號位)010取反101,在取反110得到負數的原碼在補碼111,在與加數進行與運算0101&0111=1001由於1+1=2進位1010在補碼得到1011最後在取反(包括符號位)0100,在取反(不包括符號位)得到正數的原碼0011在補碼0011整數的補碼就是本身!在進行加法運算時不需要做額外的補碼運算,所以加法運算要快於減法運算!

乘法運算過程:
十進位制:
5*2=10
二進位制:
0101*0010=01010

實現過程:
首先CPU會初始化三個通用暫存器用來存放被乘數,乘數,部分積的二進位制數,部分積暫存器初始化為0!
然後在判斷乘數暫存器的低位是低電平還是高電平(0/1)!
如果為0則將乘數暫存器右移一位,同時將部分積暫存器也右移一位,在位移時遵循計算機位移規則,乘數暫存器低位溢位的一位丟棄,部分積暫存器低位溢位的一位填充到乘數暫存器的高位,同時部分積暫存器高位補0!
如果為1則將部分積暫存器加上被乘數暫存器,在進移位操作。
當所有乘數位處理完成後部分積暫存器做高位乘數暫存器做低位就是最終乘法結果!

CPU處理過程:
0101*0010=1010
首先初始化三個通用暫存器存放被乘數(0101),乘數(0010),部分積(0000),在判斷乘數暫存器為0/1,判斷乘數暫存器(0010)低位為0則直接進行對乘數暫存器和部分積暫存器進行位移!
乘數暫存器:0010->1=0001溢位0丟棄
部分積暫存器:0000->1=0000溢位0填充到乘數暫存器高位同時部分積暫存器高位補0
此時乘數暫存器裡的二進位制數為0001,部分積暫存器為0000!

在判斷乘數暫存器低位為0/1,判斷結果為1則先讓部分積暫存器加上被乘數暫存器在進行位移動!

部分積加上被乘數:
部分積暫存器:0000+0101=0101
位移:
乘數暫存器:0001->1=0000低位溢位的1丟棄
部分積暫存器:0101->1=0010
低位溢位的1填充到乘數暫存器高位同時部分積暫存器高位補0
此時乘數暫存器為1000,部分積暫存器為0010!

在判斷乘數暫存器低位為0直接位移
乘數暫存器:1000->1=0100低位溢位的0丟棄
部分積暫存器:0010->1=0001,低位溢位的0填充到乘數暫存器高位同時部分積暫存器高位補0
在乘數暫存器為0/1,判斷結果為0則直接進行位移:
乘數暫存器:0100->1=0010低位溢位的0丟棄
部分積暫存器:0001->1=0000低位溢位1填充到乘數暫存器高位同時部分積暫存器高位補0
位移完後的乘數暫存器為1010,部分積暫存器為0000。

當所有乘數處理完後部分積暫存器做高位乘數暫存器做低位:00001010,轉換為十進位制就是10!

除法運算過程:
十進位制:
10/2=5
二進位制:
1010/10=101

實現過程:
首先CPU會初始化三個暫存器,用來存放被除數,除數,部分商!餘數(被除數與除數比較的結果)放到被除數的有效高位上!
CPU做除法時和做除法時是相反的,乘法是右移,除法是左移,乘法做的是加法,除法做的是減法。
首先CPU會把被除數bit位與除數bit位對齊,然後在讓對齊的被除數與除數比較(雙符號位判斷)。
這裡說一下什麼是雙符號位判斷:
比如01-10=11(前面的1是符號位) 1-2=-1 計算機通過符號位和後一位的bit位來判斷大於和小於,那麼01-10=11 就說明01小於10,如果得數為01就代表大於,如果得數為00代表等於。
如果得數大於或等於則將比較的結果放到被除數的有效高位上然後在商暫存器上商:1 並向後多看一位
(上商就是將商的最低位左移1位騰出商暫存器最低位上新的商)
如果得數小於則上商:0 並向後多看一位
然後迴圈做以上操作當所有的被除數都處理完後,商做結果被除數裡面的值就是餘數!

CPU處理過程:
首先初始化三個暫存器存放被除數,除數,部分商,部分商會初始化為0(可初始化也可以不初始化因為會做上商過程)
首先把被除數暫存器左移2位與除數暫存器對齊:
1010<<2=10(10)
在用對齊後的被除數與除數做比較:
10(10)-10=00 剛好等於沒有溢位所以上商1,商為0001,在將相減的結果(00)放到被除數有效的高位此時被除數有效的最高位為10(10),此時被除數的bit位為0010,
在左移1位:
0010<<1=001(0)
在用位移後的被除數與除數做比較:
001(0)-10=11 符號位為1負數也就是說被除數小於除數所以上商0,商為0010
在左移0位
0010<<0=0010
在用位移後的被除數與除數做比較:
0010-10=00 兩個符號位都為0相等所以上商1,商為101,在將其放到商的有效高位此時被除數的有效bit位為最低的兩位(00)10
所有的被除數處理完後商做結果被除數做餘數,商為101,餘數為00,轉換成十進位制就是5餘0!

知識點:
現在很多CPU都有自己的乘法器和除法器,這些器件的工作原理和我上面寫的一樣,都是通過ALU(算術邏輯運算單元)呼叫加法器來協調工作完成計算!這些運算器存在於CPU內部,一般每個運算器都是由ALU,通用暫存器,專用暫存器,電晶體和一些其它附加電路組合而成,專用暫存器是指一些只能用於固定功能的暫存器,比如程式計數暫存器(PC),標誌暫存器(FR),堆疊暫存器(SP),作用是固定的只能用來存放地址或者地址基址!
浮點數在計算機中有特定的浮點儲存器來存放和浮點運算器來運算,不同精度的浮點數能精確到小數點後的不同位,比如float單精度能精確到小數點的後7位雙精度能精確到16位,這個精確度取決於你的電腦記憶體和CPU,假如你的記憶體允許精確到7或者16位但是CPU不支援也是無法處理那麼多位的!