计算机组成原理408
提示:有什么問題歡迎大家指出
目錄
- 基礎
- 一、CPU
- 二、主存儲器
- 三.進制+碼
- 校驗碼
- 補原碼的操作
- 指令系統
- 中央處理器
- 總線
- IO
基礎
通過電信號傳遞二進制0/1,低電平為0(低電壓)
金屬針腳就是用來接受電信號的,一個針腳接受一個二進制位
主板上的印刷電路(一條一條的線)是用來導電的(傳遞電信號)
一位=1b B=字節=8位(大多數情況)
硬件發展:電子管-晶體管-中小規模集成電路-大規模,超大規模集成電路
翻譯程序有兩種:解釋程序:即一條一條代碼依次翻譯和執行,如一些腳本語言等等,不會生成目標程序。編譯程序:整個代碼一起翻譯和執行,一個程序只翻譯一次,如c,Java等等
匯編:把匯編語言源程序轉變為機器語言程序
指令和數據用二進制表示 指令由操作碼和地址碼組成
吞吐量:指系統在單位時間內處理請求的數量
基準程序=跑分軟件 按字節編碼=每個地址對應1個字節
完整的計算機系統應包括配套的硬件設備和軟件系統
馮·諾依曼機中CPU 區分它們是指令還是數據的依據是取數還是取指令是在指令周期的不同階段,
傳統馮·諾依曼機以存儲器為中心,程序的功能都是通過中央處理器執行指令,數據都在指令中直接給出
一、CPU
CPU=運算器+控制器 cpu+存儲器(主存)=主機(和日常主機不同)CPU中有地址寄存器但運算器和控制器中沒有地址寄存器
運算器:由ACC(累加器,用于存儲操作數或運算結果),MQ(乘商寄存器,用于存放操作數或運行結果),ALU(核心,通過復雜的電路實現算術運算,邏輯運算),X(通用操作數,用于存儲操作數)四個部分構成
控制器:包括CU(核心部件,分析指令,發送控制信號),IR(指令寄存器,存放當前執行的指令,PC(存放下一條指令,自動加一))
完成一條指令的步驟:1.PC-MAR一M→MDR一IR
取指令,根據PC取指令到IR。將PC的內容送MAR,MAR中的內容直接送地址線同時控制器將讀信號送讀/寫信號線,主存根據地址線上的地址和讀信號,從指定存儲單元讀出指令,送到數據線上,MDR從數據線接收指令信息,并傳送到IR中。
2,OP(IR)-→CU
分析指令: 指令譯碼并送出控制信號。控制器根據R中指令的操作碼,生成相應的控制信號,送到不同的執行部件。在本例中,R中是取數指令,因此讀控制信號被送到總線的控制線上。
3,Ad(IR)一MAR一M一MDR—ACC
執行指令:取數操作。將IR中指令的地址碼送 MAR,MAR中的內容送地址線,同時控制器將讀信號送讀/寫信號線,從主存指定存儲單元讀出操作數,并通過數據線送至 MDR,再傳送到ACC中。
4.最后(PC)+1——>PC (加個括號指PC中的內容,一般別省略)
CPU執行時間(執行整個程序所需要的時間),t=CPIna (CPIn指執行一個程序的總消耗,1/a是cpu每秒能夠完成的消耗,例CPIn=500,cpu主頻=1000,則t=0.5秒,每秒能夠完成1000,所以t=0.5)
CPI是執行一條指令所需的時鐘周期數(一般用平均數,理解為執行一條指令所需的時間,每個計算機執行同一條指令的CPI不同),n是這個程序有n個指令,a是CPU的時鐘周期(時鐘周期和CPU主頻(時鐘頻率)是互為倒數,時鐘周期可以理解為時鐘的周期)
IPS:每秒執行多少條指令=主頻/平均CPI.。平均指令周期為IPS的倒數
(在這些名詞縮寫前面加上K,M,G,T表示規模,K=千,M=百萬,后面依次1000)
計算機的工作過程:例:y=ab+c
首先存儲器中會存儲一系列指令用于執行這串代碼,還會存儲一些數據(如a=2,b=3等等)這些指令按地址存儲在存儲單元中,這些指令分為操作碼和地址碼
1.PC=0,并指向第0條指令(地址為0的指令,指令內容是取a到ACC)(PC=1)
2.PC將這條指令的地址傳給MAR(MAR=0)
3.存儲體通過MAR上的地址找到這條指令(地址為0的數據),并把數據給MDR
4.CPU中的IR從MDR獲取數據,并把數據(指令)中的操作碼給CU,CU經過分析得知這是取數(從存儲器中讀取數據)指令(這一步見存儲器作用1)
5.將讀取到的數據給ACC(a=2)
下一條指令的執行,地址是1,內容是乘b得結果ab,存于ACC中
運行依然是先獲取指令,分析指令,即1234步,然后是下面的123步,其他操作類似
1.將獲得的數據b存于MQ中,并將ACC中的數據給X,
2.CU通過控制線通知ALU進行乘法運算
3.ALU將X和MQ中的數進行乘法操作,并將結果放于ACC中,
–最后程序的結束是由操作系統完成的,
門電路:與門相當于乘法,或門相當于加法,運算時符合四則運算規則
用門電路實現加法運算:
二、主存儲器
存儲器分為主存儲器(內存)和輔助存儲器(也稱外存)。CPU 能夠直接訪問的存儲器是主存儲器。輔助存儲器用于幫助主存儲器記憶更多的信息,輔助存儲器中的信息必須調入主存后,才能為CPU所訪問。
主存儲器:包括存儲體(存儲數據)和MAR(地址寄存器=存儲器中存儲單元的最大的個數,MAR=32,則存儲器的最大容量為2^32* 8(MDR)),MDR(數據寄存器=存儲單元的大小,MDR=8)( 現在MAR和MDR都會與CPU放在一起 )
與CPU作用1.CPU從存儲器拿(讀取)數據。首先CPU將數據的存儲地址給MAR,MAR將地址給存儲體,存儲體通過地址找到數據將數據給MDR,然后CPU從MDR處拿數據
與CPU作用2:CPU寫入數據到存儲器,首先CPU將數據要寫入的地址給MAR,將數據給MDR,存儲器通過MAR.MDR存儲數據
數據在存儲體中的存儲方式:數據在存儲體體中按地址順序存儲,每一個地址指向一個存儲單元
存儲單元:存放一串二進制數據(由若干個存儲元構成)
存儲字=存儲單元:存儲單元中的一串二進制代碼我們稱為存儲字(存儲字)
存儲元:輸入高低電壓以產生一位二進制0/1的電子元件,
存儲字長:存儲字的長度(8的倍數,字長的長度都是字節的整數倍,半字長指令長度=機器字長的一半
存儲體:由若干個存儲單元構成
機器字長=ALU=X:CPU一次能處理的二進制數據的位數
指令字長:一個指令字包含二進制代碼的位數,一般取存儲字長的整數倍
地址線:大小等于存儲體中存儲單元的數量(MAR)
數據線:大小等于MDR的大小
數據通路帶寬:指數據總線一次所能并行傳送信息的位數。
存儲器的總容量=MARMDR(單位 位)
存儲速度:數據傳輸率(主存帶寬)=數據的寬度/存儲周期
存儲周期=存取時間(一次)+恢復時間(一次)
存儲器所用的芯片RAM+ROM
隨機儲存器的讀寫時間和物理位置無關,順序儲存器和物理位置有關(磁帶),直接存儲器綜合前兩點(磁盤,光盤)。后兩又稱串行存儲器,包括等。前三種是按地址訪問,相聯存儲器(快表)是按內容訪問
半導體隨機存取存儲器(需要一直通電,斷電則內容丟失,易失性存儲器(RAM都是易失性))
SRAM(靜態隨機存儲器) 常用作Cache 觸發器構成,反之
DRAM(動態隨機存儲器) 常作主存,電容構成,需刷新,慢,發熱小,集成度高,價格低,是破壞性
刷新周期一般為2ms,讀寫周期一般為0.5us,以行為單位刷新
例:假設DRAM的內部排列成128128的形式(數據以行列模式存儲(二維數))
異步刷新:2ms內每行刷新一次即可,一共128行,則2ms刷新128次,則每2ms/128=15.6us刷新一次,則每15.6有0.5us的死時間(用于讀寫的時間)
集中刷新:128次刷新一起完成,有死時間/死區 分散刷新:2/128刷新一次,綜合前兩種
只讀存儲器ROM(U盤,固態硬盤),非易失性,但有些rom是可以寫的
金屬引腳的數量=地址線(多條)+數據線(多條)+片選線(1條)+讀寫控制線(可能2條)
主存容量擴展線選法:一條線控制一個芯片,(假設1為給芯片通電,0為給芯片斷電)
譯碼片選法:一條線控制兩個芯片(假設1為給芯片1通電,0為給芯片2通電)
(65)多體并行存儲器:多個簡單存儲體并行連接而成
高位交叉編址模式:即用高位區別多個存儲體(例前兩位用于區別存儲體則可區別4個存儲器)
在連續訪問地址時(即連續的一串地址),由于高位交叉編址模式的高兩位用于區分存儲器,則每一列地址是連續的(即一塊存儲體中的地址是連續的,只能先訪問完一塊存儲體才能訪問第二塊存儲體,而在低位交叉編址模式中則可以在訪問第一塊存儲體時過一小段時間(小于存儲周期)訪問第二塊存儲體
Cache(高速緩沖存儲器):一小塊速度非常快的內存,造價高,內存小,速度快,用于cpu和主存間的數據對接
命中率:CPU預訪問的信息已經在Cache中的比率H
主存的平均訪問時間=Ht+(1-H)(t+T) (t是訪問一次Cache所需時間,T訪問一次主存所需時間)
主存將數據發往Cache可以一整塊一整塊數據的發,而與cpu對接時一次只能發一個數據(即內存間的數據流通可以是一整塊,而與cpu只能一個一個)
Cache與主存的地址映射:組相連映射:將Cache分為幾個組,組內隨意放(假設有8個行,則分為4個組,用兩位標記組號,一位判斷是否被使用)
直接映射:主存塊號模Cache的總組數得到主存塊在Cache中的位置
全相連映射:隨便放 (標記位是Cache中用于區分是主存中的哪一個塊(塊號),若主存共有16個塊,則標記位需要4位。CPU在訪問時先將主存塊號與Cache中的標記位一一比對,若相等且有效位為1則Cache命中。若Cache共有8組,則主存塊號的末尾3位能直接反映其在Cache中的位置,因為主存塊號是按順序編號的,則這三位可以不用存儲在Cache中)
在主存中也取兩位分組,假設有一行地址為00,則在00組內隨意放(編號為00的有兩個行)
Cache中滿了的替換:替換掉不常用的數據
近期最少使用算法LRU:1.命中時,所命中的行的計數器清零,比其低的計數器加 1,其余不變
2.末命中且還有空雨行時,新裝入的行的計數器置 0,其余全加 1
3.未命中且無空閑行時,計數值為 3 的行的信息塊被淘汰,新裝行的塊的計數器置 0,其余全加 1
最不經常使用算法:
Cache工作原理:
虛擬存儲器:將一個程序(進程)分為多個大小相等的頁(數據塊。頁大小和主存塊一樣)
頁表包括邏輯頁號和對應的主存塊號,頁表在主存中
快表,用于存儲經常訪問的頁號
三.進制+碼
真值就是十進制表示的值,帶±號的 沒有特別說明,符號位不帶入計算
C語言的數據在內存中為補碼形式
進制間轉換:后綴H,B,D分別表示16,2,10進制
基數:r進制的基數為r,十進制之所以叫十進制是因為每一個數的取值范圍為0~9十個數,且逢十進一
則其他進制轉為十進制為 abcd.e=arrr+brr+cr+d+e1/r 各進制的計算用逢r進一的方法
二進制轉為其他進制,因為三個二進制數有最多8種可能,則每3位二進制數進行一組運算,不足三位在前面補0(小數點后面補0),例1111=17(八進制)
其他進制轉為二進制,是上面的逆運算,例17 1=001 7=111,所以17=1111(八進制)
十進制轉為其他進制,例75/r,一直取余即可(整數位),小數位則0.3r,一直取整即可,例0.32=0.6(取0)0.62=1.2(取1)0.22=0.4(取0)0.42=0.8(取0)0.82=1.6(取1)則到此為止(出現重復的數)則0.3用二進制表示就是0.01001
BCD碼:(使用二進制編碼的十進制數)用四位二進制表示一位十進制,分別有:
8421碼:有權碼,對于每一位十進制數來說,四位二進制來表示0 ~ 9.對于四位二進制來說,每一位二進制數代表的值是8421。所以0000 ~ 1001分別對應0 ~ 9。在計算機做加法運算時,若加法的結果在10到15之間,則結果不正確,需要再加6(0110)并高位補0修正(例0101+1000=1101,但1101不在8421碼里面,所以1101+0110=10011才是正確結果,最后用8421碼表示為0001 0011)
余3碼:(無權碼,每一位二進制數代表的值是變的)即在8421碼的基礎上加3表示0 ~ 9位數
0011 ~1100表示十進制0 ~ 9
2421碼:(有權碼,四位二進制每一位的權值是2421)0 ~ 4以0開頭,5~9以1開頭,因為防止一個數有多個可能,比如6可以等于0111或1100
字符與字符串的存儲:(GB 80)中文字符占兩個字節(兩個英文),中文按一種類似坐標的方式存儲,每個中文字符由兩個數字表示.例如一張9494的表存儲中文字符,漢族”啊“可能在(1,1)位置
在處理中英文時可能會出現錯誤,比如計算機在識別中文時可能會將中文識別成英文,英文ASCII碼的范圍是0 ~ 127,這個范圍是包含0 ~ 93的。則在處理“啊”這個中文時我們會先在(1,1)左右都+32(20H),將范圍變為32 ~ 125(ASCII碼中0~32是控制通信字符)(1,1)叫區位碼,左右都+32(20H)后叫國標碼,左右都再加80H(128)叫漢字內碼(實際使用的)
漢字用漢字字形碼表示,即一個漢字在一塊充滿像素的區域內,占到的像素則表示1,不占到的為0
大端模式:正常存儲模式,從左到右順序存儲(左為高位)
小端模式:從右到左逆序存儲(便于機器)
校驗碼
在傳送數據時可能會出現一些錯誤,可能會使某個1變為0,0變為1,校驗碼可以檢測錯誤并且修改
碼距:各合法碼字間的最小距離(兩個合法碼字間不同位的個數)101和001的距離為1
碼字:例A的編碼為00,00就是一個碼字,在一個編碼方案中,不存在的編碼為不合法碼字
奇偶校驗碼:只具有檢測錯誤的能力,碼距為2
在編碼的首部或者尾部添加一個校驗位(一位),在添加一位后,編碼中的1的個數位奇數為奇校驗碼
這樣,在出現錯誤時(即某一位改變時),1的個數會變,就能根據奇偶性判斷出錯誤
實現:硬件上可以通過異或運算或者取模運算得知需要在首部加0還是1,即從頭開始每一位數與他下一位數進行異或運算,例1001=0,則需要加一位0。判斷是否出錯則只需要再進行一次異或運算,結果是1則說明數據傳送出錯(異或運算,有一個1則結果為1,全1也為0)
海明校驗碼:以下是從大到小(方向左-右),1位糾錯,2位檢測,無法區分是一個位錯還是兩個位錯。2^k>=k+n+1 (k是需要的校驗碼的個數,n是信息位的個數。用這個公式可以算出需要多少位校驗碼
海明碼=信息位+校驗碼 校驗碼必須放在2^(i-1)位置上(i是第i個校驗碼,其他位按順序填入即可,例:1011需要3個校驗位,則應該是101a1bc,abc為三個校驗位的代號)
對于校驗碼的值,取信息位位于海明碼中的位置(在第幾位),生成二進制數(即某信息位在第3個位置,則生成的二進制數為011,k個位)
把他們按順序從上-下排列(按順序取數),取所有二進制的最后一位數為1的生成一組(最后一位數為1的信息位組成一組),然后進行異或運算,結果便是一個校驗碼的值,然后取倒數第二位(偶校驗)
糾錯:對每個組進行一次異或運算(偶校驗),出現1則出錯,將異或運算得到的結果取十進制則得出錯的位置(在海明碼首位加一個全校驗位,對整體進行偶校驗,當出錯時,如果全體偶校驗成功則為兩個位出錯,失敗1位出錯)
循環冗余校驗碼(CRC)糾錯能力很差,檢測用的多.適用于數據量大的檢測
一般題目會給一個多項式以生成被除數,例G(x)=x^ 3 + x^ 2+1 這個式子
=1x^ 3+1x^ 2+0x ^1+1 x ^0 于是被除數就是1101(約定一個除數,使原數據除這個數結果為0,則若傳過來的數據除這個數不是0,則說明傳輸出現錯誤(求得的余數不是出錯的位數)
這個最高次冪3就是要補的校驗碼的個數,然后在信息碼(原數據)后面加3個0(校驗碼)
然后進行模2除操作(1101) 假設信息碼為101001 則101001000/1101
101001000(取1(首位)與1101相乘)
1101 (得,取首位1作為結果的首位數)
111 (后三位進行異或運算)
1110 (后補一位,與除法類似,取首位1作為結果的第二位數)
1101 (取1(首位)與1101相乘)
0111 (后三位進行異或運算,并后補一位)
0000 (取0(高位),乘1101得)
余數是001(校驗位,比被除數少一位) 結果是1101001最終的CRC碼是結果+校驗位
補原碼的操作
取模運算:x = qm +r,0 ≤r<m (q和r都是整數,r是結果,求-3%12可以等于-3=-1* 12+9 所以-3%12=9)
定點數:小數點位置固定不變的(通常的寫法)(c語言定點整數用補碼存儲)
浮點數指科學計數法表示的數。定點小數指純小數,小數點隱含,例1001=11=-0.5
無符號數:只表示整型量,無±
原碼:二進制表示的值,用符號位表示正負,即在最前面加一個表示符號的位,1表示-,0表示+
如指明長度,則補0,如5位,3D=0 0101
反碼:如符號位為0,則反碼與原碼相同。如為1,則反碼與原碼相反(0-1)
補碼:如符號位為0,則補碼與原碼相同(|-y|補等于將-y先變成反碼再變成補碼)如為1,則補碼=反碼值加1
定點整數補碼:10000000表示-2 ^ 7,若機器字長n+1位,補碼整數的表示范圍:-2^ n ≤x≤2^n-1 (比原碼多表示一個—2 ^n )
定點小數補碼: 1.0000000表示-1,若機器字長n+1位,補碼小數的表示范圍:-1 ≤x≤1-2^(-n)(比原碼多表示一個-1 )
補碼—>原碼(無說明則操作不包含符號位)方法和原碼到補碼一樣,全部取反,+1即可
作用:將減法用加法表示
只要將負數用其補碼(符號位帶入轉補碼計算)代替然后直接相加即可,假如是8位,而結果是9位,則舍去第一位(對2的8次方求模)
移碼:將補碼符號位取反即可 用于整數比大小
移位運算:對于原碼:左移相當乘2,右移相當于除2,移位時補0,但如果將1移出則會出現誤差
反碼,對于正數反碼與原碼相同,對于負數反碼在移位時要補1
補碼:對于正數反碼與原碼相同,對于負數右移補1,左移補0
循環移位:即將移出的一位補到空位上(帶進位位的)(首位移到尾位,循環)
邏輯移位:帶符號位移位,移出補0
加減運算:設機器字長為8位,加減運算于十進制加法運算(手算)方式相同(a+b=a+(-b))
例:a=15,b=-24 則a原=00001111 b原=10011000
【A+B】補=【A】補+【B】補 【A-B】補=【A】補+【-B】補(【B】補連同符號位一起取反加1)
補分別為:00001111 11101000 則a+b=11110111(原碼=10001001=-9)
-b=00011000(對b補同符號位一起取反,+1)
溢出判斷:當正+正(上溢)時和負加負(下溢)時會出現溢出(結果大于8位數能表示的區域)
1:v={a&&b&&(!c)}||{(!a)&&(!b)&&c} v=0則無溢出 v=1則溢出
a為+數的符號位,b為被加數的符號位,c為結果的符號位(對于上面的例子a=0,b=1,c=1)
2:(模2補碼)用一個符號位判斷溢出,a=第一位,b=溢出位(即向更高位進的一位) (結果,上例中a=0,b=0) b=1,a=0下溢,b=0,a=1上溢
3.(模4補碼)用兩個符號位,01上溢,10下溢(一般只有一個符號位)
不會增加內存空間,相當于只用一個符號位,因為在運算之前會復制一個符號位
定點運算器中,無論是雙符號位還是單符號位都必須有溢出判斷電路,一般用異或門實現
符號擴展:正數:在符號位后+0即可,負數:原碼在符號位后+0即可,
補碼表示負數的符號擴展方法:原有形式的符號位移動到新形式的符號位上,新表示形式的所有附加位都用1(對于整數)或0(對于小數)進行填充(前面加1即可?)。反碼表示負數的符號擴展方法:原有形式的符號位移動到新形式的符號位上,新表示形式的所有附加位都用1進行填充。
原碼的乘除:手算乘法和十進制算法一樣,那么在運算器中是如何實現乘法的呢?
在運算器中,被乘數存儲在X(01101)中,乘數存儲在MQ(01011)中,乘積存儲在ACC中,例0.10110.1101 乘除再看書
1.ACC一開始是0,若MQ的最低位為1,則ACC=ACC+X(相當于ACC=0+10.1101,相當于計算0.00010.1101,然后下一步應該是0.0010.1101(進一位)
2.則ACC和MQ中的數作為一個連通的整體右移(邏輯右移)一位(高位補0),移出的舍棄(移出的是已經計算過的數)結果是ACC=00110,MQ=10101。此時MQ的最低位1,則進行一次加法ACC=ACC+X=00110+101101 數值位有4位,則重復操作4次即可
除法:恢復余數法(如果x必須小于y,不然結果大于1)
ACC在這里存儲被除數或余數,MQ存儲商(默認為00000,上0則最后一位為0,上1則最后一位為1),X存儲除數
設x=0.1011,y=0.1101,求x/y 則{-|y|}補=1.0011(x-y=x+(-y))
則初始ACC等于01011,X等于01101,MQ等于00000
1.由于計算機不會比大小,則只能默認上1,則ACC=ACC-X=11110(為負)
這時候計算機知道錯了,則ACC=ACC(11110)+X=01011(恢復為初始值=上0)
2.邏輯左移(錯位) 3.重復12,4次
不恢復余數法(加減交替法)
若ACC為負,則上0,然后,邏輯左移,再讓ACC=ACC+X
若ACC為正,則上1,然后,邏輯左移,再讓ACC=ACC-X
若最后一步ACC為負則ACC=ACC+X(恢復余數)
(手算)首先用x+{-|y|}補,若余數為負則商0,則余數左移并+|y|補
若為正則商1,然后余數左移并+{-|y|}補,重復n次
補碼的乘除:乘法:在MQ的最后增加一個輔助位(a),乘數的符號位參與運算
規則:a-b(MQ中除輔助位的最后一位)=1,則ACC+x補
=0,則ACC+0, =-1則ACC=(-x)補
例:設機器字長為5位(4個數值位),x=-0.1101,y=+0.1011
則x補=11.0011 (-x)補=00.1101 y補=0.1011
每一次后進行算數右移(符號位不動,邏輯右移符號位動)(就是以ACC和MQ為整體右移一位)
共循環4次
除法:加減交替法 符號位參與運算,采用雙符號位
x=-0.1101,y=+0.1011–>>x補=11.1101,y補=00.1011(y/x)
1.首先被除數和除數同號,則被除數減去除數;異號則被除數加上除數。
2.余數和除數同號,商1,余數左移一位減去除數;余數和除數異號,商0,余數左移一位加上除數。
3.重復n次。最末尾恒商1 (x為除數,余數是每一步計算的結果)
c語言中的類型強制轉換:如果是長的變短的(int(4字節)->short(2字節)),則直接截斷高位保留低位,如果是短的變長的,如果是負數直接在前面加1,為正數加0。如果是有符號變無符號,帶符號位計算即可
邊界對齊:指以對齊的方式存儲地址,假設存儲字長為32位,則1個字為32位,半字為16位=2個字節
則一行可以存儲1個字的大小,如為邊界不對齊,則如果要存儲1個字節和兩個半字,則第一行會存儲1個字節和一個半字(浪費空間)
如邊界對齊則會存儲1個字節和1個半字和1個半字的前一部分,然后下一行接著存儲這個半字的后半部分(浪費時間,最后一個半字要讀兩次)
浮點數:N=r^E * M (r為進制數(也可取進制數的n次方比如22=4),E為階碼(1.12*109,則E=9),M為尾數,(1.12) 例:階碼,尾數均用補碼表示,求a的值 a=0,01;1.1001
前面的0,01為階碼,第一個0是符號位,階碼的真值為1,尾數的原碼為-0.0111
則a的真值=2^1 * (-0.0111)=-0.111(乘2的n次方相當于將小數點后移n位)
左規:假如a的真值為0.0111(小數點后第一個數為0)則可將這個0刪除(左移一位)并使階碼-1
右規:假如a的真值為11.111(小數點前有超過1位數),則將小數點左移一位,并階碼+1
在補碼表示尾數時,如果符號位為1,則小數點后的第一位數必須是0(規格化時,上面的左規或者右規
例:a的階碼和尾數分別為0.110;1.1110100,尾數用補碼表示,則如何將a規格化?
將尾數小數點左移三位(保證小數點后第一位為0)低位補0,尾數則為=1.0100000,每左移一位,階碼1,所以階碼應該減3,則階碼=6-3=3=0.011
浮點數標準:IEEE 754(讀作I tripe E)
移碼的定義:移碼=真值+偏置值(一般取2的n-1次方,n為機器字長)
在IEEE754中。偏置值取2^(n-1) -1,
在IEEE754中,一個浮點數由三部分表示,數符(表示正負),階碼和尾數
其中階碼用移碼表示,尾數用原碼表示,在用原碼表示時,一般第一位數為1,則假如尾數用23尾數表示,我們一般指隱藏了第一位數1,則一共有24位數(1.后接23位數)
階碼中全1和全0用作特殊用途,當階碼全為0時,尾數不全為0,則表示非規格化小數。 尾數全為0時表示±0
當階碼全為1,尾數全為0時,表示無窮大,尾數不全為0時,表示"NaN"(Not a Number,進行0/0等非法運算時就會出現這個結果)
float為 1 8 23 double為 1 11 52
例:將-0.75轉為IEEE754float格式,
-0.75=-0.11=-1.1(2^-1)(規格化)
則數符=1,尾數部分=.10000000(隱藏1)
階碼的真值為-1 移碼=-1+1111111(偏置值)=01111110(湊8位)
浮點數的加減例:x=-5/256,y=+59/1024 x-y=?(階符取2位,階碼取3位,數符取2位,尾數取9位
x=-0.1012^-5= -0.1012 ^ -101 y=+0.111011*2 ^-100
用補碼表示尾數和階碼:x補=11011,11.011000000 y補=11100,00.111011000(階符取2位,階碼取3位,數符取2位,尾數取9位)
1.對階:即使xy的階碼相等,首先求階差,使x的階碼-y的階碼,結果為-1(負數),則x的階碼小于y,則使x的尾數的小數點左移一位,且階碼值加1(小階向大階看齊)
對階后x=11100,11.101100000
2.尾數加減:x-y=x+[-y]補
3.規格化(左規或右規)(雙符號位為10/01時需規格化為00/11)
4.舍入,尾數的長度是有限的,超過了則要舍/入,在規格化時,如果舍棄的是1,則尾數的值+1(可能會繼續溢出,則繼續右規),如果是0,則直接舍棄,方法2:直接將末尾的數恒置為1
5.判溢出:階碼位數也是有限的,上溢拋異常,下溢則視為0
強制類型轉換,當尾數位數大于另一類型的位數時,轉換無損失
char->int->long->double float->double 這些轉換都無損失
指令系統
指令由一串二進制數據構成(格式)=操作碼+地址碼
指令通常由5部分構成,即操作數,左操作數,右操作數,以及結果和取的下一條指令(每部分都要用二進制位表示)
四地址指令:四地址指令指需要存取4條地址(后四條,操作數用某一串二進制表示即可(操作數是進行操作中的±*/符號))
三地址是四地址中除取的下一條指令的地址,二地址是三地址中除結果,一地址是二地址除右操作數
假設一套指令的各個地址的指令長度不變則稱為定長
擴展操作碼:即假設指令字長(用于表示整條指令的最大二進制位數)為32位,則可設計各個地址所用的二進制位數(將操作碼用于區分地址)
假設令一套指令滿足有15條三地址12條二地址62條一地址32條0地址
則用前四位(操作碼)中的0~ 14表示三地址,則剩1111用于區分三地址,然后1111+四位(0~11)表示二進制
指令尋址方式指令尋指:下一條欲執行指令的指令地址
指令地址始終由程序計數器PC給出,順序尋址即按地址排列順序尋址,
跳躍尋址即從某一個地址跳躍到某一地址
數據尋址:確定本條指令的操作數地址,操作數為一些數據類型,有數字,邏輯數,字符,地址這些類型。數據尋址(一地址模式(只有一個地址(形式地址)),假設A為存儲地址的地方,則一個地址就需要一個尋址特征,用于確定用哪種數據尋址方式)主要有一下幾種形式:
立即尋址:A就是數據(共訪存1次) 直接尋址:A是數據在主存中的地址(共訪存兩次)
間接尋址:A是一串地址,這個地址指向數據在主存中的地址(相當于調用過程)
寄存器直接尋址和寄存器間接尋址只是把主存換為寄存器而已,由于寄存器是在CPU中的一塊內存,所以寄存器存取速度很快
隱含尋址:隱含在操作碼中 偏移尋址:A中存儲的地址是由數據的地址通過加法獲得的
基址尋址:基址寄存器中的內容(BR)加上A中的地址就是最終數據在主存中的地址
BR是可變的,所以可用于編制浮動程序(地址浮動)
變址尋址:變址寄存器(IX)加上A中的地址就是最終數據在主存中的地址,即指令可以增減 相對尋址:相對于某一行指令進行操作 這三種方式經常混合使用
堆棧尋址:用多個寄存器(內存)形成一個棧,然后出棧入棧元素進行操作即可
指令集合:CISC 復雜指令集 主要用于筆記本臺式機上(X86架構)
復雜,大,字長不固定,不限制可訪存指令,通用寄存器數量較少,各種指令執行時間和使用頻度相差大
RISC 精簡指令集 主要用于手機平板等(ARM架構)與上面相反
中央處理器
PU的基本構成:ALU+CU(控制器)+中斷系統+寄存器
指令周期:CPU取出一條指令并執行完這條指令所需要的全部時間,這個時間有一下幾個部分組成
取址周期:1.(PC)->MAR PC是存儲地址的,()表示取地址,這條語句的意思是取當前指令地址到MAR
2.1->R CU發送控制信號經控制總線到主存,(讀信號)
3.M(MAR)->MDR 這里M指存儲器,意思是取M中位于MAR表示的地址的數據到MDR
4.(MDR)->IR IR是指令寄存器
5.(PC)+1->PC
間址周期:間接取址1.Ad(IR)->MAR(Ad表示取的是地址) 2.1->R 3.M(MAR)->MDR
執行周期:執行指令
中斷周期:程序中斷所用的時間
CPU內部數據通路:數據在功能部件之間傳送的路徑,其基本結構有以下幾種
1.單總線:多沖突,性能低
2.多總線:
3.專線:性能高,硬件量大
控制器的設計
硬布線: 繁瑣,快,不規整,修改困難,應用場合RISC CPU 微程序反之
設計步驟:1.分析每個階段的微操作序列 2.選擇CPU的控制方式 3.安排微操作時序
4.電路設計(1)列出操作時間表 (2)寫出微操作命令的最簡表達式 (3)畫出邏輯圖
微程序:由微指令(包含多個微命令)序列組成,每一種指令對應一個微程序
程序:由指令序列組成
如果指令系統中有n條機器指令,CM中微程序的個數至少是n+1個
CPU可以不包含間址周期、中斷周期的微程序段
微指令由操作控制字段和下地址構成
微指令格式:垂直型微指令
水平型微指令(程序短,速度快,微指令長)
字段直接編碼方式:將微指令的控制字段分成若干“段”,互斥性微命令分在同一段內,相容性微命令分在不同段內。一般每個小段還要留出一個狀態,速度慢
微程序控制單元設計步驟:1.分析每個階段的微操作序列
2.寫出對應機器指令的微操作命令及節拍安排 3.確定微指令格式 4.編寫微指令碼點
指令流水優化指令執行方式(指令重疊執行)硬件并行運行
吞吐率:單位時間流水線完成任務的數量
加速比:不使用流水線和使用流水線的時間比
效率:設備利用率
影響流水線的因素:
資源沖突(結構相關)由于多條指令在同一時刻爭用同一資源而形成的沖突稱為結構相關。
解決辦法:1.后一相關指令暫停一周期2.資源重復配置:數據存儲器+指令存儲器
數據沖突(數據相關)存在必須等前一條指令執行完才能執行后一條指令的情況,
解決辦法:1.把遇到數據相關的指令及其后續指令都暫停一至幾個時鐘周期,直到數據相關問題消失后再繼續執行。可分為硬件阻塞(stall)和軟件插入“NOP”兩種方法。
控制沖突(控制相關)當流水線遇到轉移指令和其他改變PC值的指令而造成斷流時
解決辦法:1.轉移指令分支預測。簡單預測((永遠猜ture或false)、動態預測(根據歷史情況動態調整)
2.預取轉移成功和不成功兩個控制流方向上的目標指令
3.加快和提前形成條件碼 4.提高轉移方向的猜準率
五段式指令流水線
運算類指令:IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:取出操作數至ID段鎖存器
EX:運算,將結果存入EX段鎖存器M:空段
WB:將運算結果寫回指定寄存器
LOAD指令:IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:將基址寄存器的值放到鎖存器A,將偏移量的值放到Imm
EX:運算,得到有效地址
M:從數據cache中取數并放入鎖存器WB:將取出的數寫回寄存器
STORE指令:IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:將基址寄存器的值放到鎖存器A,將偏移量的值放到Imm。將要存的數放到BEX:運算,得到有效地址。并將鎖存器B的內容放到鎖存器Store。
M:寫入數據cache
WB:空段
條件轉移指令:IF:根據PC從指令Cache取指令至IF段的鎖存器
lD:進行比較的兩個數放入鎖存器A、B;偏移量放入lmm
EX:運算,比較兩個數
M:將目標PC值寫回PC
WB:空段
無條件轉移指令:IF:根據PC從指令Cache取指令至IF段的鎖存器
ID:偏移量放入Imm
EX:將目標PC值寫回PC(左圖沒畫全)M:空段
WB:空段
總線
CPU和主存之間通過總線相連
總線是一組能為多個部件分時共享的公共信息傳送線路
同一時刻只允許一個部件向總線發送信息,多個部件要發送信息只能分時
-特性:
分類:按數據傳輸形式分為串行和并行總線
按功能分類可分為3類:片內總線(芯片內部總線)
系統總線:系統內各個功能部件(CPU,主存等等)中間相互連接的總線。又分為三類:
數據總線,雙向。運輸數據
地址總線,單向,MAR中的地址信息會經過地址總線
控制總線:包括CPU送出的控制命令和主存返回CPU的反饋信號(讀/寫)
通信總線:用于通信,在外部又稱外部總線
系統總線的結構:單總線結構:系統總線,結構簡單,成本低,易于接入新設備,帶寬低,負載重
雙總線結構:(主存+io)將速度慢的io總線分出去,提高速度
三總線結構:增加一個DMA總線(直接內存訪問)
四總線結構:CPU總線,系統總線,高速總線,擴充總線
按時序分為同步總線和異步總線
性能指標:總線的傳輸周期(總線周期):一次總線操作所需的時間(包括申請階段、尋址階段、傳輸階段和結束階段),通常由若干個總線時鐘周期(等于機器時鐘周期)構成。
總線的工作頻率:總線上各種操作的頻率,為總線周期的倒數。
若總線周期=N個時鐘周期,則總線的工作頻率=時鐘頻率/N。實際上指一秒內傳送幾次數據。
總線的時鐘頻率:即機器的時鐘頻率,為時鐘周期的倒數。實際上指一秒內有多少個時鐘周期。
總線寬度:又稱為總線位寬,它是總線上同時能夠傳輸的數據位數,通常是指數據總線的根數,如32根稱為32位(bit)總線。
總線帶寬:可理解為總線的數據傳輸率,即單位時間內總線上可傳輸數據的位數,通常用每秒鐘傳送信息的字節數來衡量,單位可用字節/秒(B/s)表示。
總線帶寬=總線工作頻率×總線寬度(bit/s)=總線工作頻率×(總線寬度/8)(B/s)
總線復用:總線復用是指一種信號線在不同的時間傳輸不同的信息。可以使用較少的線傳輸更多的信息,從而節省了空間和成本。
信號線數:地址總線、數據總線和控制總線3種總線數的總和稱為信號線數。
總線仲裁:多個主設備競爭總線的控制權
集中仲裁方式:獲得總線控制權的設備會發出總線忙的信號
工作流程:1.主設備發出請求信號;⒉.若多個主設備同時要使用總線,則由總線控制器的判優、仲裁邏輯按一定的優先等級順序確定哪個主設備能使用總線;3.獲得總線使用權的主設備開始傳送數據。
分為鏈式查詢方式:信號按鏈式(優先級排列)傳遞,獲得總線的設備會截斷信號
計數器查詢方式 :結構特點:用一個計數器控制總線使用權,相對鏈式查詢方式多了一組設備地址線,少了一根總線響應線BG;它仍共用一根總線請求線。若計數器從0開始,則和鏈式查詢一樣
分布仲裁方式:沒有中央仲裁器
設備使用總線的四個周期 1.申請控制權 2.尋址: 3.傳輸: 4.讓出控制權
總線定時:是指總線在雙方交換數據的過程中需要時間上配合關系的控制,分為以下幾種
同步定時:總線控制器采用一個統一的時鐘信號來協調發送和接收雙方的傳送定時關系。速度快
異步定時:沒有統一時鐘信號,從設備會發出信號回答主設備,又分為以下三種
不互鎖:主設備不等回答,從設備自動撤銷回答
半互鎖:主設備等回答,從設備自動撤銷回答
全互鎖:主設備等回答,從設備等主設備接收到回答后才撤銷
半同步定時 分離式定時
(88)波特率:
比特率:
有效數據傳輸率:
-(89)usb,IDE,SATA等等總線標準
IO
數據流:鍵盤→io接口的數據寄存器→數據總線→CPU某寄存器→主存(變量i的對應位置)
CPU如何控制鍵盤io的完成?
1.程序查詢方式:CPU不斷輪詢檢查i/o控制器中的“狀態寄存器”,檢測到狀態為“已完成”之后,再從數據寄存器取出輸入數據
2.程序中斷方式:等待鍵盤i/o時cPU可以先去執行其他程序,鍵盤i/o完成后l/o控制器向CPU發出中斷請求,CPU響應中斷請求,并取走輸入數據
3.DMA控制方式:主存與高速I/O設備之間有一條直接數據通路(DMA總線)。CPU向DMA接口發出“讀/寫”命令,并指明主存地址、磁盤地址、讀寫數據量等參數。DMA控制器自動控制磁盤與主存的數據讀寫,每完成一整塊數據讀寫(如1KB為一整塊),才向CPu發出一次中斷請求。
IO指令包括操作碼(識別io指令),命令碼(做什么操作),設備碼(對哪個設備進行操作)
4.通道方式。3.4用于數據傳輸率高的設備
VRAM容量:=分辨率灰度級位數
VRAM帶寬:=分辨率灰度級位數*幀頻
磁盤存儲器位密度:每一圈的位數是一樣的,所以越內全密度越大
磁表面存儲器:容量大,價格低,記錄介質可重復使用,記錄信息長期保持可脫機,非破壞性讀出
平均存取時間=尋道時間(磁頭移動到目的磁道)+旋轉延遲時間(磁頭定位到所在扇區)+傳輸時間(傳輸數據所花費的時間)
磁盤地址包括驅動器號,柱面(磁道)號,盤面號,扇區號
工作過程:尋址,讀,寫(讀寫不能同一時刻進行)
io接口的工作原理:
io端口及其編址:統一編址:靠不同的地址碼區分內存和/o設備,I/o地址要求相對固定在地址的某部分。程序設計靈活,控制邏輯電路簡單,缺點是占用主存地址空間,地址譯碼速度慢
獨立編址:靠不同的指令區分內存和/o設備。
程序查詢方式:
中斷:
可屏蔽中斷:關中斷下不會響應(實現原子操作)
中斷判優(優先級):硬件故障中斷屬于最高級,其次是軟件中斷;
非屏蔽中斷優于可屏蔽中斷;
DMA請求優于io設備傳送的中斷請求
高速設備優于低速設備;
輸入設備優于輸出設備;
實時設備優于普通設備。
中斷處理過程:1.關中斷 保護斷點和現場期間不能被新的中斷所打斷
2.保持斷點 3.引出中斷服務程序 4.保存現場和屏蔽字 5.開中斷
6.執行中斷服務程序 7.關中斷 8.恢復現場和屏蔽字 9.開中斷,中斷返回
DMA方式:
匯編語言:
LDA D 這里的A指ACC,這段代碼的意思是取地址D中的數據到ACC中
LDA #0 #是立即尋址的意思,即將0賦值給ACC
LDX X指變址寄存器
ADD D+1 這段代碼的意思是將D+1的值和ACC中的值進行相加,結果賦給ACC(第三行)
INX 這段代碼相當于X++
CPX #10 CP一般和BNE合用,這段代碼的意思是X-10,若結果為0,則Z=1,否則Z=0(Z應該是CP內部的一個標識位)
BNE M 若Z=0,將M的值賦給PC,若Z=1.則PC=PC+1(M是某一行代碼的地址,在這里表示第三行(自己定義的))(PC是一個計數器,表示下一條待執行的代碼的地址)
總結
以上是生活随笔為你收集整理的计算机组成原理408的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu:Terminal终端命令
- 下一篇: 利用FreeMarker生成java源代