計算機組成原理-錯題本
時間單位:s ms μs ns 依次相差1000倍
65536=2^16
目錄
1.移碼和補碼的關係
同一數值的移碼與補碼符號位相反,其它各位相同;故0的移碼和補碼錶示形式唯一。
2.地址對映
在虛擬儲存器中,當程式正在執行時,由____完成地址對映。
A.程式設計師 B.編譯器 C.裝入程式 D.作業系統 答案:D
程式在系統中執行,須經過以下步驟。
- 編譯,由編譯程式對使用者源程式進行編譯,形成若干個目標模組
- 連結,由連結程式將編譯後形成的一組目標模組以及他們所需要的庫函式連結在一起,形成一個完整的裝入模組;
- 裝入(虛擬地址-->實體地址),由裝入程式(Loader)將裝入模組裝入記憶體。因此在實際執行時,已經編譯且裝入過了,地址對映交由作業系統來完成,對程式設計師透明
形成邏輯地址——【連結階段】;完成虛實地址轉換——【裝載階段】。
連結舉例:如C語言編譯出main.c file1.c file1.h等,在連結前一步生成了file1.o等目標模組(都是邏輯地址從0開始的東東),把這三個目標模組和libc和庫檔案【連結】成一個可執行檔案(形成整個程式的邏輯地址)。
【翻譯程式】實現 :高階語言程式--->機器語言程式(目的碼)
——分為【編譯】(一次全部翻譯成目標程式)和【解釋】(翻譯一句執行一句,不會生成目標程式)。
【注意】彙編程式屬於【解釋】方式——將組合語言源程式翻譯為機器語言程式(目的碼)。
3.匯流排tips
掛接在匯流排上的多個部件 只能分時向匯流排傳送資料,但可同時從匯流排接收資料。
(正確)單匯流排結構中,可以不用I/O指令——CPU、主存和I/O裝置(通過I/O介面)都掛在一組匯流排上,若裝置和主存統一編址,則可方便地使用訪存指令訪問I/O裝置。
(錯誤)非同步匯流排中,傳送操作由裝置控制器控制。——非同步通訊的匯流排,沒有公共時鐘,依靠的是傳送雙方相互制約的握手訊號來實現定時控制。
計算:匯流排的寬度是資料匯流排的位數,與地址匯流排/控制匯流排位數無關。
匯流排資料傳輸率=匯流排工作頻率 × (匯流排寬度/8)
——匯流排寬度(位寬):匯流排能同時傳輸的資料位數=資料匯流排的根數,如32根稱為32位匯流排。
【匯流排集中仲裁】的三種方式:
計數器定時查詢的栗子:8個I/O裝置,需3根裝置地址線對應。若每次計數器從0開始計,則裝置小的優先順序max;若每次計算器從當前裝置開始計,則每個裝置的優先順序相同。
【匯流排分佈仲裁】不需要中央控制部件,各潛在裝置都有自己的仲裁號和仲裁器。
4.規格化浮點數
(1)若階碼為三位,用補碼錶示;尾數7位,用原碼錶示,其中一位為符號位;以2為底,則十進位制數27/64的浮點規格化數是
C.1110110110
【解析】首先排除A、D,它們非規格化,因為規格化的原碼,最高數值位為1。27/64的原碼錶示:0.0110110=0.110110×2-1。左移一位成規格化數。階碼用補碼:111。
(2)設浮點數的基數為4,尾數用原碼錶示,則以下(C)是規格化的數。
A.1.001101 B.0.001101 C.1.011011 D.0.000010
【解析】規格化規定尾數的絕對值≥1/R(R為基數),並≤1。這題:當基數為4時,尾數絕對值應≥1/4,尾數用原碼錶示,則小數點後面2位不全為0即為規格化數。
PS:對於基數為4的原碼尾數,每右(或左)移2位,階碼加(或減)1。
5. 算術左移的溢位
補碼,當資料的最高位和符號位不同時,此時進行算術左移會導致符號的變化,從而超出該資料設定的範圍大小(造成溢位)。
——等價於【對某個資料乘2運算相當於對該資料二進位制數進行不帶符號位左移一位。】
【典例1】數位每左移1位相當於原數乘以2,為防止左移操作造成溢位,補碼左移的前提條件是:其原最高有效位
A.為0 B.為1 C.與原符號位相同 D.與原符號位相異 答案: C
解析: 補碼錶示時,最高數位為“0”時是有效位、為“1”時是無效位,故算術左移時,最高數位丟“0”,結果出錯,而丟“1”,則不對結果產生負面影響。最低數位為“1”時是有效位、為“0”時是無效位,故算術右移時,最低數位丟“1”,影響精度,而丟“0”,則不對結果產生負面影響。
【典例2】某字長為8 位的計算機中,已知整型變數 x、 y 的機器數分別為[x]補=1 1110100, [y]補=10110000。若整型變數 z=2*x+y/2,則 z 的機器數為( )。
【常規做法】x的補碼算術左移為11101000(因為x的資料最高位和符號位相同,所以左移沒事),y的補碼算術右移為11011000, 兩者相加可得111000000。可知符號位產生的進位為1,最高有效位產生的進位也為1,兩者相同,則無溢位。 最高一位1丟掉得最終結果11000000。
【快速做法】把補碼按位取反加個1,x=-12,y=-80,z就等於-64,八位的負數最大為-2的7次方,沒有溢位,-64用補碼錶示就是1100 0000。
【補碼從低位到高位找到的第一個1的左邊均與反碼相同,該1的右邊均與原碼相同】
PS(1):補碼左移溢位的判斷依據是,當符號位與最高數值位不同時,左移會溢位。
——舉例:補碼1011即原碼為1101(十進位制為-5),而補碼左移1位補碼變成1110即原碼為1010(十進位制為-2);而如果補碼1100即原碼為1100(十進位制為-4),而補碼左移1位補碼變成1000(十進位制為-8)。
PS(2):【邏輯移位】左移和右移都是空位補0;【算術移位】負數補碼是左移添0右移添1.
6.補碼一位乘
實現N位(不包括符號位)補碼一位乘時,乘積為 位(2007年 西安電子科技大學)
A.N B.N+1 C.2N D.2N+1 答案:D
解析:補碼一位乘法運算過程中一共向右移位N次,加上原先的N位,一共是2N位數值位,因乘積結果加上符號位,故共2N+1位
7.主存&CM
主存 | 控制儲存器 | |
功能 | 存放程式和資料 | 存放微程式 |
位置 | 在CPU外部 | 在CPU內部 |
成分 | RAM | ROM |
控制儲存器(只讀型儲存器ROM——因為每條微指令執行時所發出的控制訊號是事先設計好即不需要改變的)存放實現指令系統的所有微指令——按照微指令的地址訪問,而主存按照主存地址訪問。
CPU不能直接訪問控存,控制儲存器對軟體開發人員是透明的;指令的運算元可以指定的地址只有【暫存器】和【主存】。
(1)在微指令的控制欄位中,每一位代表一個【微命令】。
(2)若用微程式控制方式,不可用μPC代替PC——μPC只是在微程式中指向下一條微指令地址的暫存器,即μPC指出的是同一條指令內的下一個微操作罷了,而不知下一條指令是啥。
8.地址題
(1)假定用若干個8K*4位晶片組成一個基地址為0的地址連續的64K*8位儲存器,則主存地址3020H所在晶片的最小地址是 (中國科學院大學2017年) B. 2000H
解析:用3020H除以8K,得到的餘數就是所在晶片,再看所在晶片的起始地址即可,根據(64K*8)/(8K*4)=16,需要16塊晶片,但是注意片選位不是4位。由於小晶片是8K即13位,儲存器為64K即16位,因此前三位用作片選;
由於64K=2^16(所以地址位數為16),3020H的二進位制位為0011 0000 0010 0000,後13位全部取0即可得到該主存地址所在晶片的最小地址 0010 0000 0000 0000,即2000H。【類似題——第39點筆記39.從地址中找ans】
(2)某計算機儲存器按位元組編址,主存地址空間大小為64MB,現用4M×8位的RAM晶片組成32MB的主儲存器,則MAR位數至少為——26位。
【解析】考察儲存器的設計。
64MB需要26位地址,但實際上只插了32位的記憶體條(25位)即只需要25位地址(實際容量),
MAR決定主存地址空間(MAR的設計是在做電路設計時就要設計好的),“實際的”是插了多少根記憶體條,若有剩餘位數則可以後再插入記憶體條,而MAR位數如果一開始確定後面是無法更改的。
MAR要保證訪問到整個主存地址空間,所以應是26位。
【回憶】RAM晶片字擴充套件可以增加儲存單元的數量,位擴充套件可以增加儲存字長。
9.浮點數
(1)在浮點機中,設尾數採用雙符號位,當補碼運算結果的尾數部分不是規格化的形式應進行規格化處理,當尾數符號位為 時,需要右規。(哈爾濱工業大學 2007年)
A.00 B.10 C.11 D.01或10 答案:D
解析:運算結果兩符號位不等,表示尾數之和絕對值大於1,需右規,即將尾數之和向右移一位,階碼加1。
(2)IEEE754浮點數C1E00000表示的真實的數是 (北京科技大學 2013年)
A. -7B. -28C. -14D. 14 答案:B
解析:(1 1000 0011 110 0000 0000 0000 0000 0000)2
符號S=1為負;指數用移碼錶示:1000 0011,即131-127=4;
尾數為110 0000 0000 0000 0000 0000 B;即完整的基數為1.11。指數為4,即小數點右移4位,為11100。
(11100)2=(0001 1100)2=(1C)16=(16+12)10=(28)10【注此處要將原碼補充完整為8位,前面填充0】又符號位為負,所以最終為-28。
注:符號擴充套件
正數:填充原符號位(其餘為0);
負數:若原碼則填充符號位(其餘為0);若補碼/反碼則原符號位移到新符號位,其餘填充1)。
10.三個時間/週期
儲存週期:連續啟動兩次讀或寫操作所需最小的間隔時間。
存取時間:指的是CPU讀或寫記憶體內資料的過程時間。
儲存時間:屬於存取時間的存操作資料的過程時間。(注意和存取時間的區分)
擴充:
(1)指令字長=儲存字長的前提下,取指週期=機器週期(=間址週期=執行週期=中斷週期),一個機器週期=k個時鐘週期。
錯誤選項舉例:指令字長=機器(錯在機器字長)字長的前提下,取指週期=機器週期。
這裡注意【機器字長】是計算機一次整數運算能處理的機器位數,即運算器ALU位數和通用暫存器寬度;
通常把一次匯流排事務訪問主存或I/O的時間定為一個【機器週期】——【儲存字長】和【指令字長】均和機器字長沒有必然的聯絡。
(2)儲存字長是指儲存體中一個儲存單位中的位數,MDR位數(資料字長)可與儲存字長不同(k倍關係即可)。
如MDR中的一個16位的二進位制數就需要佔用兩個儲存單位的空間。
(3)如果指令字長=2 × 儲存字長,則需要2次訪存,取指週期=機器週期×2;
指令字長取決於操作碼的長度、運算元地址的長度和運算元地址的個數,但是為了硬體設計方便,指令字長一般取位元組或儲存字長的整數倍。
(4)【讀懂題外話】若不採用指令預取技術——則每個指令週期都需要取指令;若不採用Cache技術,則每次取指令都至少訪問記憶體一次(當指令字長與儲存字長相等且邊界對齊時)。
11.五種I/O方式
第一種是程式查詢方法,依靠CPU不斷的執行查詢指令(軟體)等進行資料傳輸。
第二種是中斷方式,通過CPU 執行中斷處理程式(軟體)完成資料的傳輸,但中斷處理需要硬體。
第三種是DMA 方式,通過在記憶體和裝置之間開設一條專用的資料通路,通過這個資料通路完成資料的傳輸,利用硬體實現資料傳輸,在資料傳輸過程中不需要CPU干預,傳輸完畢後,要進行資料校驗等工作時,DMA部件會發出一箇中斷,請求CPU進行後續工作。
第四種是通過通道方式,DMA方式需要CPU來控制傳輸的資料塊大小、傳輸的記憶體位置,而通道方式中這些資訊是由通道控制的,通道程式(軟體)控制資料交換。(每個DMA控制器對應一臺裝置與記憶體傳遞資料,而一個通道可以控制多臺裝置與記憶體的資料交換,總之通道相當於一個弱雞版CPU。)——通道是軟硬結合。
——通道與CPU共享記憶體,但通道獨立於CPU,即有自己的指令系統(只有資料傳送指令、裝置控制指令)。
——CPU通過【I/O指令】控制通道,也即一開始CPU要組織1個通道程式&使用I/O指令啟動通道,同理I/O操作結束後,通道程式向CPU發出【中斷響應】。
第五種是IO 處理機。
其中DMA 是完全依靠硬體完成資料的傳輸;中斷和通道是依賴軟體與硬體;程式查詢方式完全採用軟體實現。
中斷方式中,若準備資料的時間小於中斷響應和中斷處理的時間,則資料會被重新整理,造成丟失。
PS:Cache與主存的地址對映由硬體自動完成。
12.分段與分頁的比較
1 | 將程式分成固定大小的頁 | 將程式分成不同的段 |
2 | OS負責實現 | 編譯器負責實現 |
3 | 速度快 | 速度比分頁慢 |
4 | 針對OS | 針對使用者 |
5 | 有內部碎片 | 有外部碎片 |
6 | 邏輯地址分為頁號和頁內偏移量 | 邏輯地址分為段號和段偏移量 |
7 | 頁表 | 段表 |
8 | 頁表項擁有一些用於表示頁細節的bit | 段表項有一些用於保護位。 |
頁是資訊的物理單位。分頁的主要目的是為了實現離散分配,提高記憶體利用率。分頁僅僅是系統管理上的需要,完全是系統行為,對使用者是不可見的。
段是資訊的邏輯單位。分頁的主要目的是更好地滿足使用者需求。一個段通常包含著一組屬於一個邏輯模組的資訊。分段對使用者是可見的,使用者程式設計時需要顯式地給出段名[高階語言裡編譯器會幹這件事]。
分頁管理中:
程式設計師使用某個記憶體單元的資料或指令時,需要指定 一維的虛擬地址即可,而這個地址可以通過地址對映對映為實體地址,
比如 : CALL 08A5H
地址對映可以根據頁面大小判斷出哪部分是頁內地址,哪部分是頁表中的頁號,然後執行。
分段管理中:
是將程式分段(比如有堆疊段,資料段等),符合程式設計師習慣,人們習慣用二維地址描述自己的程式,比如
MOV BP, [DS]85H 或者 CALL [X][116]
將 資料段 85H的內容COPY到暫存器BP中,或者 跳轉到 X段 。。。。
所以說它是二維的,段名和段內地址。與所謂的“頁號+頁內地址”不是一個事。
綜上:
在頁表中找一個虛地址,你只要給一個地址,我就能算出來在哪一頁,頁偏移多少,所以是一維的(只要一個地址即可)
在段表中找一個虛地址,看上去給的也只有一個虛地址就能找到,但是,其實,這個虛地址是段號和段內偏移這兩個地址放在一起合成的,是2個地址(這兒和頁不同,頁的頁號和頁內偏移可以自己計算,所以是1個地址),所以是2維。
13.大小端
口訣:小端就是0x1234是34 12(以資料的低位元組為字地址)
(低位元組(LSB)是指1234的34,又叫最低有效位元組——試卷給出的機器數的最右邊1B的數)
將32位數0x12345678按照低位元組為字地址存放,則按位元組地址由小到大依次存為 78563412
解析:每個十六進位制數代表4個二進位制位,故每兩個十六進位制數構成一個位元組,作為一個存放單位(如78H構成一個存放單位),又採用以低位元組地址為字地址(即小端)的存放方式,故由小到大依次存為78 56 34 12。
大端模式:資料的高位元組儲存在記憶體的低地址中,和我們的閱讀習慣一致;
小端模式:資料的高位元組儲存在記憶體的高地址中。
14.地址譯碼器&指令譯碼器
CPU的結構中沒有地址譯碼器。地址譯碼器在主存中。地址譯碼器的作用就是用來接收CPU 送來的地址訊號並對它進行譯碼,選擇與此地址碼相對應的儲存單元,以便對該單元進行讀/寫操作。
注意和指令譯碼器區分,指令譯碼器是控制器的一部分,屬於CPU一部分,僅僅對操作碼進行譯碼。
15.ALU細節
ALU只能有一個輸入端可與匯流排相連,另一輸入端需通過暫存器與匯流排相連
解析:由於ALU是一個組合邏輯電路,故其運算過程中必須保持兩個輸入端的內容不變,又由於CPU內部採用單匯流排結構,故為了得到兩個不同的運算元,ALU的一個輸入端與匯流排相連,另一個輸入端需通過一個暫存器與匯流排相連;此外,ALU的輸出端也不能直接與內部匯流排相連,否則其輸出又會通過匯流排反饋到輸入端,影響運算結果,故輸出端需通過一個暫存器(用來暫存結果的暫存器)與匯流排相連。
16.計算[x-y]補
(1)已知[x]補,求[-x]補,即[x]補連同符號位在內每位取反,末位+1,即可得到[-x]補。
------------------------上條規則等效於第25條:正補碼變負補碼:如25=0001 1001B(就是將25寫成二進位制形式),變成-25的方法是:將上面的數從右往左看,從第一個1左邊的數字起(包括該數字)往左,全部取反(無加1)。
(2)[x-y]補=[x+(-y)]補=[x]補+[-y]補,即[x-y]補=[x]補+[-y]補。
(3)大多數計算機系統都x採用補碼錶示機器數。
補碼可方便解決補碼數的擴充問題,因在補碼錶示中,全1表示-1,所以對負數補碼進行擴充,可以直接補符號位,如1001擴充成8位,可以寫成11111001,0111擴充成8位,可以寫成00000111。
例題(1)
某計算機字長為8位,其CPU中有一個8位加法器。已知有符號數x=-69,y=-38,現要在該加法器中完成x-y的運算,則該加法器的兩個輸入端資訊和輸入的低位進位資訊分別是 。(中國科學院大學 2018)
C.1011 1011,0010 0101,1 答案: C
解析: 考察加法器。加法器執行減法操作的過程是將減法轉換為加法,且執行補碼運算。
X=[-69]10=[-100 0101]2=[1100 0101]原=[1011 1011]補
Y=[-38]10=[-010 0110]2=[1010 0110]原=[1101 1010]補
加法器對減法的處理是把減數求反,然後輸入端的低位進位訊號置1。
所以加法器的兩個輸入端的輸入訊號分別為1011 1011和0010 0101,且低位進位為1。
例題(2)
參考2017真題(https://blog.csdn.net/qq_35812205/article/details/108005393)
雖然i和n均unsigned型,但這裡是cmp指令的計算機內部比較功能,即用到補碼加減法運算器。
總之,無符號數的減法是用補碼的【x-y】補=【x】補+【-y】補運算的。
例題(3)
【注意】得到-33和65後,可以直接計算-98的補碼(先算98的補碼,再根據最右1的左邊全取反得到-98的補碼)。
17.磁碟容量
磁碟儲存器格式化容量=每道扇區*扇區容量*總磁軌數(柱面數)*記錄面
物理位置的確定依靠(柱面號,盤面號/磁頭號,盤區號)
【典例】若磁碟轉速為7200 轉/分,平均尋道時間為8ms,每個磁軌包含1000 個扇區,則訪問一個扇區的平均延遲時間大約是 。(西安電子科技大學 2015年)B. 12.2ms
解析:存取時間 = 尋道時間 + 延遲時間 + 傳輸時間。存取一個扇區的平均延遲時間為旋轉半周的時間,即為(60/7200)/2=4.17ms ,傳輸時間為(60/7200)/1000=0.01ms(此處是將0.008ms四捨五入) ,因此訪問一個扇區的平均存取時間為4.17+0.01+8=12.18ms ,保留一位小數則為12.2ms。
【延遲時間】磁頭定位到一個扇區的時間,即旋轉半軸的時間;如果題目給出“磁碟控制器延遲(指最先的磁碟啟動時間)”則還要加上這個。
【傳輸時間:先求一圈的時間,一圈(一個磁軌)又包含1000個扇區,求的一個扇區對應時間即傳輸時間】
18.Cache容量計算
【原則1】標記陣列中的有效位和標記位(主存字塊標記)是一定有的,而一致性維護位(髒位)和替換演算法控制位的取捨標準是看題眼,題目中,明確說明了採用寫回法,則一定包含一致性維護位,而關於替換演算法的詞眼題目中未提及,則不予考慮。
【原則2】寫回法:當CPU對Cache寫命中時,只修改Cache的內容,而不立即寫入主存,只有當此塊被換出時才寫回主存。這種方法減少了訪存次數,但存在不一致的隱患。每個Cache行必須設定一個標誌位(髒位),反映該塊是否被CPU修改過,1位修改位即髒位(回寫策略,根據髒位判斷資料是否更新,若髒位為1則需要寫回記憶體。
【原則3】組相聯對映:組間用直接對映,組內全相聯對映。 Cache的組號=主存的塊號 mod Cache的組數(mod為求餘運算)
主存字塊標記 | 組地址(組號) | 字塊內地址 |
(1)假定主存地址為32 位,按位元組編址,主存和Cache 之間採用直接對映方式,主存塊大小為4 個字,每字32 位,回寫,則能存放4K 字資料的Cache 的總容量的位數至少是 148K
解析:按位元組編址,塊大小為4 × 32bit=16B ,則“字塊內地址”佔4 位;“能存放4K 字資料的Cache ”即Cache 的儲存容量為4K 字(注意單位),則Cache共有1K=2^10個Cache 行,則Cache 字塊標記佔10 位;則主存字塊標記佔32 - 10 - 4=18 位。
Cache總容量=data+標記陣列(有效位、標記位、一致性維護位和替換演算法控制位)。
從而每個Cache 行標記項包含18+1+1=20 位,則標記陣列容量為:2^10*20 位=20K 位,儲存容量為:4K*32 位=128K 位,則總容量為:128K+20K=148K 位。
(2)Cache採用什麼對映方式?若Cache採用LRU替換演算法和回寫策略,則Cache每行中除資料、Tag和有效位外,還應有哪些附加位?Cache總容量是多少?
【解析】圖中看出Cache中每組有2行,因此採用2路組相聯對映方式。Cache每行還有1位LRU位(LRU替換演算法,注意如:如果是8路組相聯則是3位的LRU位)、1位修改位即髒位、有效位。28位實體地址中Tag欄位佔20位,組索引欄位佔3位,塊內偏移地址佔5位,因此Cache共有2^3=8組,每組2行,每行共有2^5=32B(注意此處和第一題不同,此題沒明確說明資料有多少字,故直接用通過塊內地址和組欄位計算).
Cache的總容量=標記+資料=2×8×(20+1+1+1)+8×2×32×8b=558B。
求組號的方法
已知Cache容量為16KB(14位),塊內地址為5位,則
(1)直接對映則中間的【組號】為(14-5=9位)
(2)8路組相聯對映則中間的【組號】為16KB /(8×2^5B)=2^6,即【組號】6位。
PS:一般求Cache總容量時,若是組相聯,組號只能得出組數資訊,注意還要根據每組有多少個Cache(即幾路組相聯),從而相乘得到Cache的總行數,不要誤以為組數即Cache行數(每個Cahce有一份標記,而不是每組)。
19.硬佈線&微程式
| 微程式控制器 | 硬佈線控制器 |
工作原理 | 微操作控制訊號以微程式的實行存放在控制儲存器中,執行指令時獨處即可。 | 微操作控制訊號由組合邏輯電路根據當前指令碼、狀態和時序,即使產生。 |
執行速度 | 慢 | 快 |
規整性 | 較規整 | 繁瑣、不規整 |
應用場所 | CISC CPU | RISC CPU |
易擴充性 | 易擴充修改 | 困難 |
RISC的目標是減少指令數(選擇常用的、暫存器型的指令,並不是為了相容CISC);RISC的複雜指令是通過簡單指令的組合實現的。
RISC各種指令絕大多數在一個機器週期內完成。
一句話記憶:CISC(compose複雜),所以指令長、執行久、難優化編譯實現,另外它是微程式——所以易擴充修改。
相關結論:
(1)若指令系統中具有n種機器指令,則控制儲存器中的微程式數至少是n+2個(增加的1個為公共的取指微程式,另1個為對應中斷週期的微程式)
(2)若要求只有Load/Store指令才能對運算元進行儲存訪問取指令、取運算元(操作簡化&時間長度固定)——簡化流水線複雜度。。
(3)一條機器指令對應一段微程式,一段微程式就是一系列微指令(下圖,結合第6點筆記)。
20.DRAM
DRAM 動態隨機存取儲存器(Dynamic Random Access Memory,DRAM)隨機存取儲存器,要電容經常週期性地充電(按行重新整理~所以行數越少越好,一次完整的重新整理過程只需要佔用1個存取週期),否則無法確保記憶長存。由於這種需要定時重新整理的特性,因此被稱為“動態”儲存器。
“靜態”儲存器只要存入資料後,不重新整理也不會丟失記憶。
(1)DRAM採用【地址複用】
——指地址訊號分2行、列2次傳送。如4M×8位的DRAM晶片,地址線是原來(log 4M)=22根的一半即11。
(2)DRAM晶片儲存陣列的行數r=32,列數c=64【意味著】地址線需要6根(取行或列所需地址線的max)。
(3)1024×8位的DRAM,地址線為(1/2)log1024=5;
——問總引腳數:5+8+4(4:行通選、列通選+讀/寫控制線。讀寫控制線可1可2)
DRAM應用於:主機記憶體;SRAM應用於Cache。
【RAM】DRAM和SRAM都是隨機儲存器(斷電後資訊丟失);但SRAM是非破壞性讀出(無需重新整理),注意如果說RAM都是非破壞性讀出則錯(DRAM是破壞性讀出)。
【ROM】FLASH同時具有ROM和RAM特性(Flash屬於只讀儲存器ROM,但又可以隨時改寫其中的資訊——相當於RAM)
按存取方式分為隨機儲存器RAM、只讀儲存器ROM——(RAM&ROM都是支援【隨機存取】,但注意只讀儲存器ROM是隻能隨機讀出而不能寫入)、
序列訪問儲存器,即第三種——序列訪問分順序存取儲存器(如磁帶)與直接存取儲存器(如磁碟)
(可和OS的直接存取儲存器即磁碟、隨機儲存的RAM&ROM、順序存取的磁帶等結合複習
https://blog.csdn.net/qq_35812205/article/details/105870386)
21.中斷遮蔽字
1級中斷的遮蔽字為1101,代表它可以遮蔽除3之外的其他所有中斷
22.十進位制數轉IEEE754短浮點數
將十進位制數-0.75轉換為IEEE754的單精度浮點數格式表示。
【解析】
注意上圖中的【126】是寫出其二進位制。(這裡要搞清楚移碼和真值相差127)
短浮點數的規定:
(階碼中0和255都是非正規階碼即(1)(2)(4)(5)點)
(1)E=0且M=0,則真值為0
(2)E=0且M≠0,為非規格化數,真值=(-1)^s × 0.M×2^(-126)
階碼部分表示為0-127+1=-126(注意這裡要+1);尾數部分隱含的數為0,即尾數為0.xxxx
(3)1≤E≤254時,真值=(-1)^s ×1.M×2^(E-127)【“正常”情況float】
——E的最大正常值為254,若尾數部分舍入後階碼加1,則最大的階碼為254-1-127=126.(第五問:使得結果不溢位的最大nhttps://andyguo.blog.csdn.net/article/details/106973174)
(4)E=255且M≠0時,真值為"NaN"(非數值)
(5)E=255且M=0時,真值為正無窮或負無窮(看符號位)
PS:非規格化浮點數參考(https://blog.csdn.net/i6223671/article/details/88312191)
23.進/借位標誌CF(記)
進位位CF(Carry Flag)與溢位位OF(Overflow Flag)
【求A+B時,進位輸出為1——即兩個最高位相加向上形成進位,則CF=1;進位輸出為0則CF=0】
擴充:當兩個無符號數相乘(umul)時,若乘積的高一半為0,則CF=OF=0;
當兩個帶符號數相乘(imul)時,若乘積的高一半是低一半的符號擴充套件,則CF=OF=0.(見第35點IMUL筆記)
【求A-B時,進位輸出為1則CF=0;進位輸出為0則CF=1】
【2017年408】無符號數,在補碼加減法運算器中執行“0減FFFF FFFFH”,即0000 0000H + 0000 0000H +1=0000 0001H,
由於進位輸出C=0,所以減法運算時的借位標誌CF=C 異或 1=1
【2013年408】“無符號數比較小於等於時轉移”功能的指令中,要檢測CF、零標誌位ZF,不涉及符號標誌NF(因為是無符號數)。
【2018年408】減法指令“sub R1,R2,R3”的功能為“(R1)-(R2)->(R3)”,(R1)=FFFF FFFFH,(R2)=FFFF FFF0H,則該減法指令執行後,CF=0 [x]補-[y]補=[x]補+[-y]補,[-R2]補=0000 0010H,[R1]補+[-R2]補 相加的結果,減法操作只需判斷借位標誌,進位輸出為1則CF=0,R1大於R2,所以借位標誌CF為0(PS:wd真題解析只說了綠色字型)。
!!注意:408真題中常考無符號數,而如果是有符號數A-B時(像下面典例2),則只用看進位位確定CF。
----------------------------------------------------------------------------------------
溢位標誌位OF為1時,表示溢位,說明暫存器中的內容不是真正的結果;
符號標誌位SF為0時,表示結果為正數(溢位標誌為1,說明符號標誌有錯);
進位標誌位CF為1,僅表示加法器最高位有進位,對運算結果不說明什麼。
經典例題(1)(408真題)
(1)錯誤思路:認為a-b,a大於b時結果的符號標誌SF=0且零標誌ZF=0,所以選B。但實際因為若溢位標誌為1,說明符號標誌有錯。
(2)這裡的A大於B,就像下圖的5-3(補碼形式,[x-y]補=[x]補+[-y]補,可結合第16點複習)一樣,其實進位輸出是1(注意不要理解成十進位制那種大數-小數“沒有進位”)所以CF=0。
經典例題(2)
2個整數x和y,x=-68,y=-80,用補碼(含1位符號位)表示,x和y分別存放在暫存器A和B中。還有2個暫存器C和D。A,B,C,D都是8位的暫存器.
(1)暫存器A和B的內容分別是什麼?
【解析】x=-69=-100 0100,則[-68]補=1011 1100=BCH,因為y=-80=-101 0000,則[-80]補=1011 0000=B0H,暫存器A和B中的內容分別是BCH,B0H
(2)x和y相加後的結果存放在暫存器C中,暫存器C中的內容是什麼?
【解析】[x+y]補=[x]補+[y]補=1011 1100 +1011 0000=1 0110 1100=6CH,所以暫存器C中的內容是6CH,其真值為108.此時溢位標誌位為1,表示溢位,即說明暫存器C中的內容不是真正的結果;符號標誌位SF為0,表示結果為正數(溢位標誌位1,說明符號標誌有錯);進位標誌位CF為1,僅表示加法器最高位有進位,對運算結果不說明什麼。
(3)x和y相減後的結果存放在暫存器D中,暫存器D中的內容是什麼?此時溢位標誌位OF是什麼?符號標誌位SF是什麼?進位標誌位CF是什麼?
【解析】[x-y]補=[x]補+[-y]補=1011 1100 +0101 0000=1 0000 1100=0CH,最高位前面的一位被丟棄(取模運算),結果為12,所以暫存器D中的內容是0CH,其真值為12.此時溢位標誌位OF為0,表示不溢位,即暫存器D中的內容是真正的結果;符號標誌位SF為0,表示結果為正數;進位標誌位CF為1,僅表示加法器最高位有進位,對運算結果不說明什麼。
1011 1100
1011 0000
1 0110 1100(最前面進位的1即CF位,注意兩個加數為有符號數;第二位為SF位)
注:產生進位不一定代表溢位。(第三小問就是一個典型例子)
24.求程式程式碼總容量
題:已知一段程式首行程式碼虛擬地址為 0040 1020 H,其機器指令為55 4D F4;最後一行程式碼的虛擬地址為0040 107F,其機器指令為 C3 D4 58 ,求程式程式碼總容量。
正解:0040 107F H +2 - 0040 1020 H +1 =0000 0062 H=98B
錯解:0040 107F H - 0040 1020 H +1 =0000 0062 H=96B
25.正補碼變負補碼
假設暫存器為8位,用補碼形式儲存機器數,包括一位符號位,那麼十進位制數-25在暫存器表示為: (杭州電子科技大學 2012年)D. E7H 答案:D
解析:25=0001 1001B(就是將25寫成二進位制形式),變成-25的方法是:將上面的數從右往左看,從第一個1左邊的數字起(包括該數字)往左,全部取反。對0001 1001B,從右往左看,第一位是1,不變;從第二位起(包括該位)往左,全部取反,就變成了1110 0111B,即E7H。
PS:負補碼變正補碼也是同樣方法。
法一:第一個1左取反
不管正數變負數還是負數變正數,都是從低位到高位,從第一個1左邊一律取反,得到相反數。如-43,由於43二進位制是0010 1011,則-43位1101 0101.
法二:將25的0001 1001包括符號位全部取反加1得到-25補碼
即常規方法:正數變負數,就是取反+1,負數變正數,就是-1取反。
26.交叉編址
低位交叉編址:可通過流水線並行存取,提高儲存器頻寬
高位交叉編址:訪問一個連續主存塊時,總是現在一個模組內訪問,等到該模組訪問完才轉到下一個模組訪問,CPU總是按順序訪問儲存模組,儲存模組不能被並行訪問,因而不能提高儲存器的吞吐率。
PS:高位多體交叉儲存器雖不能滿足程式的連續讀取,但仍可能一次連續讀出彼此地址相差一個儲存體容量的4個字(只是這麼讀的概率較小)。
簡單計算題(1):一儲存器支援四體交叉存取,某程式執行過程中訪問地址序列為3,9,17,2,51,37,13,4,8,41,67,10.請問哪些地址訪問會發生體衝突?
【解析】首先將訪問地址分別%4得到模組序號。
訪問地址 | 3 | 9 | 17 | 2 | 51 | 37 | 13 | 4 | 8 | 41 | 67 | 10 |
模組序號 | 3 | 1 | 1 | 2 | 3 | 1 | 1 | 0 | 0 | 1 | 3 | 2 |
如何判斷是否訪存衝突:若相鄰的4次訪問出現同一個模組序號,則後者和前者訪存衝突。
簡單計算題(2):某計算機字長為32位,儲存體的儲存週期為200ns。採用四體交叉工作,用低2位的地址作為體地址,儲存資料按地址順序存放。主機最快多長時間讀出一個資料字?儲存器的頻寬是多少?
【解析】因為每個體的存取週期是200ns。四體交叉輪流工作,每2個體間讀出操作的延時為1/4個儲存週期,理想情況是每個存取週期平均可以讀出4個資料字,讀出一個資料字的時間平均為200ns/4=50ns.資料字長為32位,資料傳輸率為32位/50ns=80MB/s
真題選擇題(3):
某計算機主存按位元組編址,由4個64M×8位的DRAM晶片採用交叉編址方式構成,並與寬度為32位的儲存器匯流排相連,主存每次最多讀寫32位資料。若double型變數x的主存地址為804 001AH,則讀取x需要的儲存週期是(3)
【解析】4體低位交叉編址。由於double型變數是8B(64bit),而一個DRAM一次存取8bit,所以讀取x要8次DRAM,因為double型變數x的主存地址為804 001AH的最低2位為10(最低2位表示該位元組儲存的晶片編號),說明它從編號為2的晶片開始儲存(從0開始編號),因此至少需要3個儲存週期(2,3;0,1,2,3;0,1)。
27.指令執行時訪存
指令執行過程中需要訪問主存時,CPU首先把被訪問單位的地址送到MAR中,然後通過地址線(單向)將主存地址送到主存中的地址暫存器,以便地址譯碼器進行譯碼選中相應單元,同時CPU將讀寫訊號通過控制線送到主存的讀寫控制電路(見下段)。
如果是寫操作,那麼CPU同時將要寫的資訊送到MDR中,在讀寫控制電路的控制下,經資料線(注意是雙向的)將訊號寫入選中的單元;如果是讀操作,那麼主存讀出選中單元的內容送到資料線,然後送到MDR中。
28.迴圈結構的地址變化
陣列A[0]首地址為2000H,經過迴圈結構和變址定址訪問陣列A元素,若某次迴圈所取元素為2100H,則此時變址暫存器內容為( 32):2100H-2000H得到100H,代表地址變化了100H(十六進位制)個記憶體單元(假設題目為按位元組編址),則100H化為十進位制256,再用256B/8B=32即現在的陣列元素下標。
常見的資料型別大小:double(8B) int(4B) short(2B)char(1B)
注意:有些題目說明就“16位計算機”,那這題的int就是16位而非32位了(https://andyguo.blog.csdn.net/article/details/108290875)。
29.介面&埠
【兩者聯絡】介面是主機和外設的交接介面;
埠指介面電路中可以進行讀/寫的暫存器,若干埠+相應的控制邏輯=介面。
PS:上圖(王道的)的地址線疑誤(應為單向),下圖顏值高點==
(1)關於介面(I/O控制器)
外設和介面一側的資料傳送分為並行介面(一個位元組/字的所有位同時傳送)&序列介面(一位一位地傳送);另外如果是主機和介面一側的資料傳送則一定是並行傳送。
PS:I/O控制器,又稱I/O介面,又稱裝置控制器。
(2)關於埠(暫存器)
指介面電路中可被CPU直接訪問暫存器。之所以能被CPU訪問是因為有埠地址(統一編址/獨立編址)。埠分為資料埠、狀態埠和控制埠。
判斷命題:I/O埠中CPU可以訪問的暫存器稱為I/O介面(正確)
I/O指令實現的資料傳送通常發生在(通用暫存器和I/O埠之間):I/O指令時CPU發出的,而AB選項和CPU沒有關係,對於B選項注意CPU和I/O裝置工作方式速度不匹配,所以需要有I/O介面作為“中介”。
30.匯流排中的地址線
.系統匯流排中地址線的功能是用於選擇 。(北京科技大學 2014年)
A.主存單元 B.I/O埠 C.磁碟資料塊 D.A或B 答案:D
解析:地址匯流排既可用於選擇主存單元,也可用於選擇I/O埠;磁碟通過磁碟控制器與主機相連,故系統匯流排中的地址線只能用來選擇磁碟控制器中的埠,而不能用來選擇磁碟資料塊。
(1)間址定址第一次訪存得到的【運算元的有效地址】通過資料匯流排送到CPU。
(2)突發(猝發)傳送是【在一個匯流排週期內】一次傳輸一個地址(先)和一批地址連續的資料(後),提高裝置的吞吐量。
(3)介面和外設的狀態資訊、I/O介面的命令字&I/O介面中的狀態字、中斷型別號也通過資料匯流排從I/O介面發往CPU。
控制匯流排包括時序訊號、I/O裝置和儲存器的相應訊號等(一般說時鐘週期不變,則控制訊號不變)。
(4)控制線和地址線都是單向傳輸,而資料線是雙向的。
——指令流是從主存流向控制器(單向),資料流是CPU中的運算器和主存之間流動(雙向)。
囉嗦一句:馮諾依曼機是以運算器為中心,而現代計算機是以儲存器為中心。
31.判斷是地址or資料
CPU判斷取出的是指令還是資料
指令在取指時,CPU通過訪問儲存器可將指令取出,在執行時,CPU訪問儲存器將運算元取出(除了立即定址是資料由指令的地址碼直接給出,其餘情況資料均存放在儲存器內)。
主存判斷資訊是地址還是資料
匯流排的型別(地址匯流排上傳輸地址,資料匯流排上傳輸資料)
【擴充】I/O指令實現的資料傳送通常發生在( )
A.I/O裝置和I/O埠之間 B.通用暫存器和I/O裝置之間
C.I/O埠和I/O埠之間 D.通用暫存器和I/O埠之間
【解析】I/O指令是CPU發出的,AC選項和CPU無關,不選。I/O埠是CPU與裝置之間的交介面。主機和I/O裝置的工作方式和工作速度有很大差異,I/O埠充當“中介”。在執行一條指令時,CPU使用【地址匯流排】選擇所請求的I/O埠,使用【資料匯流排】在CPU暫存器和埠之間傳輸資料。
——————————————
在統一編址下,訪問主存和訪問I/O裝置是通過不同的地址碼來區分的;在獨立編址下,則是通過【不同的指令】區分。
32.單週期CPU
單CPU中所有指令的指令週期為一個時鐘週期(即一個時鐘週期內完成一整條指令,即只能把CPU週期拉長,時脈頻率降低)。
單週期CPU要配合多個部件在一個週期內完成一條指令,所以要配合多匯流排結構(單匯流排結構不支援併發傳送,即只能有一個部件爭用匯流排);反之,單匯流排要配合多週期CPU(一個時鐘週期內只能完成一個部件的工作,而完成一條指令需要多個部件協調).
(1)時鐘訊號不變,控制訊號即指PC中操作(每次自動加1即可),所以指令執行中控制訊號大體不變。
(2)時脈頻率不會影響到CPI,但可以加快指令的執行速度:若一條指令的執行需要10個時鐘週期,則執行這條指令在時脈頻率為1GHz的CPU比100MHz的CPU要快。
附:多週期CPU
即一條指令分為多個時鐘週期。分為【不定長的機器週期】(耗時短的要向耗時長的階段看齊即要滿足最慢的來執行,另一種方法是給短的填充成等長)&【定長的機器週期】。
多核CPU
多核CPU仍然是指單晶片處理器(“核心”:指令部件、算術邏輯部件、暫存器堆和一級/二級的快取處理單元);多核之間共享一個統一地址空間。
33.校驗碼
奇偶校驗碼(指data和校驗位兩坨中1的個數為奇數的碼)只能測出奇數位錯誤,不能測出偶數位錯誤。
【例題】設在資料傳送中採用偶校驗,若接收到程式碼為10111011,則表明傳送中
C.未出現錯誤或出現偶數位錯 答案:C
解析:偶校驗只能發現一位錯,但不能確定是哪一位錯,不能糾錯,當碼字中出現偶數位錯時,碼字中“1”的個數仍是偶數,所以不能發現錯。題中碼字“10111011”中“1”的個數是6為偶數,所以有可能是未出現錯誤或者出現了偶數位錯誤。
34.溢位判斷
補碼浮點數加減法判斷溢位3種方法(口訣:大同社會—不溢位):
- 採用一位符號位:只要參加操作的2個數符號相同,結果又與原運算元符號不同,則表示結果溢位;
- 採用雙符號位:運算結果的兩個符號位相同,表示未溢位。注意此時最高符號位才代表真正的符號。
- 採用一位符號位(根據進位情況):結果中符號位的進位和最高數位的進位相同,則表示不溢位(若不同則表示溢位)
(408真題)減法指令“sub R1,R2,R3”的功能為“(R1)-(R2)->(R3)”,該指令執行後將生成進位/借位標誌CF和溢位標誌OF。若(R1)=FFFF FFFFH,(R2)=FFFF FFF0H,則該減法指令執行後,CF和OF分別為多少( )
A.CF=0,OF=0 B.CF=1,OF=0 C.CF=0,OF=1 D.CF=1,OF=1 答案:A
解析:[x]補-[y]補=[x]補+[-y]補,[-R2]補=0000 0010H,[R1]補+[-R2]補 相加的結果中符號位的進位和最高數位的進位相同(若不同則表示溢位),可以判斷溢位表示OF為0。
減法操作只需判斷借位標誌,R1大於R2,所以借位標誌CF為0(此處CF可以參照第23點筆記)。
35.IMUL&UMUL指令
根據IMUL指令的規定,如果結果的高一半的所有位,與低一半的第一位相同,則OF=CF=0,如果不相同,則OF=CF=1。
詳細參考(https://zhidao.baidu.com/question/77188082.html?qq-pf-to=pcqq.c2c)
【若乘積的高33位為非全0或非全1,則OF=CF=1】(2019年計組大題第四問考了這個)
(1)當兩個無符號數相乘(umul)時,若乘積的高一半為0,則CF=OF=0;
(2)當兩個帶符號數相乘(imul)時,若乘積的高一半是低一半的符號擴充套件,則CF=OF=0.
【2020年408】int型x和y作乘法(x=2^31-1,y=2),n=32,判斷imul和umul下是否溢位。
-
unsigned umul ( unsigned x , unsigned y) {
-
return x*y;
-
}
-
int imul ( int x, int y ) {
-
return x * y;
-
}
【解析】imul指令和umul指令得到的64位乘積的機器數都是0000 0000 FFFF FFFEH。
(1)int的表示範圍為-2^31到2^31-1,所以函式imul()的結果溢位(即不能正確表示應有的結果——2^32,而機器數解讀為負數了),故imul()結果溢位。
(2)unsigned int型的表示範圍是0到2^32-1,所以umul的結果不溢位。
附常用匯編指令:
一、資料傳送指令
(1)【mov指令】記憶體和暫存器直接移動data。將第二個運算元(暫存器/記憶體/常數值)
(2)【STA指令】把暫存器的內容寫入指令的記憶體單元。如STA X(X為主存地址):隱含定址,將ACC內容寫入主存X。
push、pop
二、算術&邏輯運算
add、sub、inc/dec(將運算元自加1/自減1)、imul、idiv、and/or/xor、neg、shl/shr
三、控制流命令
jmp、jcondition/jle、call/ret(call儲存呼叫之前的地址資訊,ret實現子程式的返回機制)
36.指令週期執行模板
37.磁軌轉圈題
【典例】磁碟每個磁軌分成9個塊/記錄(A~I),轉1個記錄需要10/9ms
(1)若記錄順序存放,讀完記錄後需要2.5ms處理
【解析】第一部分:每開始讀一塊至轉到【序號連續的下一塊】前需要用10/9圈;第二部分:讀第9個&處理。
耗時=10×8×(10/9)+10/9+2.5=92.5ms
(2)請實現順序讀出,求耗時
【解析】畫圖便於理解。轉1個記錄約1.1ms,剛好轉3個才能達到3.3即大於2.5ms,所以間隔3個放。
耗時=40-(3×10/9 -2.5)=39.17ms
【同理】——每轉1個邏輯記錄要20/2=2ms,所以T(優)=2ms×3個記錄×10次=60ms
T(初)=(8+3)/10圈×前9個+最後一個記錄用3/10圈=102/10圈,即204ms,最後204-60=144ms。
38.data型別轉換
資料型別的轉換 | 轉換原則 |
同一型別但字長不同的資料間的轉換(如int和long) | 由字長短的轉為字長長的 |
定點數與浮點數之間的轉換 | 由定點數轉換為浮點數 |
整型數中的有符號數和無符號數間的轉換 | 機器數不變(只是看待符號位的角度不同,代表的數值也隨之不同) |
【混合運算原則】型別提升:char(1B)->int(4B)->long(4B)->float->double(8B).
【舉例】float要轉成double才能和double型運算(最後結果也是double)——該轉換由系統自行進行(隱式型別轉換)。
【典例】int i=785,float f=1.5678e3 ,double d=1.5e100,(d+f)-d==f的結果不為真;i==(int)(float)i的結果為真
【解析】浮點運算d+f需要對階(小階向大階對齊),對階後f的尾數有效位被捨去而變為0,所以d+f的結果仍然為d,再減去d後結果為0,故結果不真.
int是精確到32位的整數,float只儲存到1+23位,所以int轉成float可能損失(雖然不會發生溢位,由於尾數位數原因,可能有資料舍入,而轉換為double則能保留精度),但i=785即小於10位(1024)所以不會又損失。
PS:int的a和b——(float)(a+b)/2是先float強制型別轉換後再除2(注意運算優先順序)。
39.從地址中找ans
(1)2010年第二問https://blog.csdn.net/qq_35812205/article/details/107786209
(2)與(1)真題類似的王道模擬題:
【原題背景】2路組,每個主存塊=8B,一個元素=32位=4B,即一個組有2個Cache行。
【第一步】根據對映方式將對映到Cache的2個行中對應的主存地址畫表格(如下);
——PS:看清楚題設:陣列元素是按行存放還是按列存放。
【第二步】由第一步的地址確定x和y陣列元素對映到哪個Cahce中;特別注意這裡組相聯中,組號=主存塊號 ÷ Cache的組數,因此不要以為第一組是放0~31。
【第三步】確定程式的元素訪問次序;
【第四步】一般問命中率,注意直接對映和組相聯對映的替換Cache略不同(組相聯對映中,如果同組的Cache未滿,則利用空閒Cache,而不需將其他Cache調出)。
(3)晶片題
【2010年408】用若干2K×4位晶片組成一個8K×8位的儲存器,則地址0B1FH所在晶片的最小地址為( )
【法一】共需要(8K×8)/(2K×4)=8,即每行需要2個晶片,每列需要4個晶片。
第一行:0000H~07FFH;第二行:0800H~0FFFH(舉例求07FF:2個晶片共2KB=2^11即1000 0000 0000-1=07FF)
第三行:1000H~17FFH;第四行:1800H~1FFFH
【法二】組成8K×8位,所以地址是13位(0 1011 0001 1111)。容量較小的晶片對應的內部地址是後面的11位,而前2位(紅色)起著片選的效果,注意由於每行的2個晶片共用一個16位地址,所以片選的是“2個2個選”,也即這類題目說的所在晶片是“大晶片”。把除前2位外其餘為0(操作類似求網路號),即0 1000 0000 0000,即0800H。
40.struct的邊界對齊
【儲存對齊的重要條件】
(1)每個成員按其型別的方式對齊,char的對齊值為1,short為2,int為4(單位均為B位元組);
存放起始地址%該成員長度=0。
(2)struct長度必須是成員中最大的對齊值的整數倍(不夠就補空位元組),以便在處理陣列時保證每一項都邊界對齊。
【前提】以下栗子均是按位元組編址。
【分析】若N為對齊值,則該成員的“存放起始地址%N=0”,而結構體中的成員都是按定義的先後順序排放的。
【例項1】設B結構體從地址0x0000開始,第一個成員b的對齊值是1(char是1B),所以其存放地址0x0000符合0x0000%1=0;第二個成員a的對齊值是4(int是4B),如果放在0x0002,2不能被4整除(注意不是看2H能否被4整除,是看2),不行(不能保證邊界對齊),
只能存放在0x0004到0x0007這4個連續的位元組中,滿足0x0004%4=0且緊鄰第一個成員;
第三個成員c的對齊值是2,可以存放在0x0008到0x0009這2個位元組中,滿足0x0008%2=0且緊鄰第二個成員。
結構體長度必須是最大對齊值(此處為4)的整數倍,故0x000A到0x000B也為B所佔用,共12B。
-
struct A{
-
int a;
-
char b;
-
short c;
-
}
-
struct B{
-
char b;
-
int a;
-
short c;
-
}
【例項2】設A結構體從地址0x0000開始,第一個成員a的對齊值是4(int是4B),所以其存放在0x0000到0x0003這4個連續位元組;第二個成員b的對齊值是1(char是1B),存放在0x0004中,滿足0x0004%4=0且緊鄰第一個成員;第三個成員c的對齊值是2,可以存放在0x0006到0x0007這2個位元組中,滿足0x0006%2=0且緊鄰第二個成員。
結構體長度必須是最大對齊值(此處為4)的整數倍,故佔用0x0000到0x0007,共8B。
【結果】sizeof(A)=8;sizeof(B)=12。
【注意】double(8B) int(4B) short(2B)char(1B)。
41.USB
USB是序列匯流排,不能同時傳輸2位資料;USB屬於裝置匯流排標準(裝置與裝置控制器之間的介面)。
而PCI、AGP、PCI-E是區域性匯流排標準(連線主存、網路卡、視訊卡等)。
附常考英文詞彙:
PCI(外部裝置互聯)——即插即用的區域性匯流排,可通過橋實現多層PCI匯流排;
————PCI匯流排與CPU及時脈頻率都無關,PCI即插即用,可對資料和地址進行奇偶校驗,用猝發傳送方式;匯流排中有多條PCI匯流排。
AGP(加速圖形介面)——連線主存和圖形儲存器,區域性匯流排
ISA(最早出現的系統匯流排)
42.無符號數的溢位
當運算結果超過n位數時就可能發生溢位,而捨棄高位有2種情況:
(1)剩下的低n位數不能正確表示運算結果:
結果超出計算機能表示範圍,有效數值進到第n+1位【稱為溢位】;
如4位無符號數14+3(1110+0011=10001),結果中第一位1是數值部分,丟了結果就不對了。
(2)剩下的低n位數能正確表達計算結果:
高位的捨去不影響運算結果;
如4位無符號數減法運算,14-3時用14加-3的補碼實現(1110+1101=11011),結果中第一位1不是數值部分,丟棄後為1011即十進位制11,結果正確。
43.多個CPI
平均CPI即這四種指令的數學期望。
【錯誤解法】取CPI的倒數——每個時鐘週期能執行的指令條數ni,再分別乘概率累加。
44.斷定方式
直接由微指令的下地址欄位指出【後繼微地址】,如整個系統中有微指令128條,則【下地址欄位】需要7位——才能定址到這128條微指令。
另一種方法【操作碼】機器指令將OP取至IR後,OP經 微地址形成部件 形成微命令的地址。
若採用微操作,則在每條指令之間加入 Ad(CMDR)->CMAR;
最後一條指令後加上 OP(IR)->微運算元形成部件->CMAR。
https://blog.csdn.net/qq_35812205/article/details/107620819
45.兩種基址定址
(1)【定址特徵】又叫【定址方式位】,如1條指令源運算元和目的運算元分別採用直接定址和基址定址則有2位定址方式位,而非1位。該指令格式如下:
OP | 定址特徵位 | 源暫存器編號1 | 源暫存器編號2 | 目的偏移量A |
(2)如若共16個通用暫存器,則R0有4位。
(3)暫存器定址——運算元在暫存器;暫存器間接定址——運算元在主存。
典型真題:https://blog.csdn.net/qq_35812205/article/details/108312417
46.PC/MAR/IR位數
(1)PC和MAR都是存放訪存的地址:PC給出下一條指令字的訪存地址,取決於儲存器的字數,儲存單元個數。
【栗子】主存為4GB,字長為32位,按位元組編址,32位字長指令字,求PC位數。
【誤區】以為PC位數=指令字長位數。
【解析】儲存器的儲存單元個數=4GB/32bit=2^30,即字數為30位,PC=30位。
(2)指令多少位IR就多少位。
【注意】指令總是根據PC從主存中取出(無論是中斷返回指令還是無條件指令——只是簡單地將跳轉地址覆蓋原來PC的內容)。——2019年指令大題第二問轉移指令
47.中斷時間軸
【傳送資料的時間】【佔用CPU的時間】(https://blog.csdn.net/qq_35812205/article/details/108133897)
【上圖內涵】CPU啟動外設A,A接收啟動命令到A將字元送入I/O埠【用時0.5ms】,I/O埠每收到1個字元申請一次中斷,中斷響應10個時鐘週期。之後CPU執行中斷服務程式【共用時20條指令】——前15條幹正事,後5條是CPU啟動下一次操作(和前面傳送基本無關,CPU和外設並行)。
一句話,以【啟動】為界限分割每個週期;這類題目問的時間時注意是否是問幾個時鐘週期;
另外求CPU用時,除了中斷服務程式時間,不要漏了請求響應的時間。
48.主存塊號&Cache塊號
主存塊號=主存地址中除了字塊內地址外的部分,即下圖中在主存右邊標出的編號。
拆分方法:如果是二進位制就數“高位”;如果是十進位制(用主存地址÷塊大小=主存塊號``````字塊內地址),本質方法都一樣,二進位制除法就是移位。
主存塊號 ÷ Cache塊數 = 主存字塊標記``````Cache塊號(可以應用2010真題https://blog.csdn.net/qq_35812205/article/details/107786209第二問)
PS:注意題目說的是主存塊號還是Cache塊號(如2016年真題第二問https://blog.csdn.net/qq_35812205/article/details/107915170題目直接說“塊號為4099的主存塊”,那4099就是主存塊號=TAG+Cache塊號,一定注意不包括塊內偏移)。
49.時間&空間區域性性
時間:一條被執行的指令,不久後該指令可能再次被執行。
空間:一個儲存單元被訪問,附近的儲存單元可能很快被訪問。
50.相對、基址、變址
———變址定址【慢於】暫存器一次間接定址(變址定址訪問暫存器IX後,還要將A和(IX)相加——運算需要時間)。
———一次間接定址【慢於】暫存器一次間接定址,因為需要2次訪存得到地址,而後者只需要1次。
———堆疊定址可能是【硬堆疊】(暫存器)或【軟堆疊】(記憶體);軟堆疊【慢於】暫存器定址。
(1)相對定址(應用:轉移指令)
EA=(PC)+A(A是當前指令地址的位移量,也只有相對定址是相對於本指令地址進行上下浮動)。EA非固定,隨PC變化,便於程式浮動。
舉例:跳轉指令地址為X,佔2B,當CPU從儲存器中取出該指令後,(PC)=X+2,在完成該指令後會自動跳轉到X+2+A的地址繼續執行。
(2)基址定址(多道程式,浮動程式)
EA=(BR)+A,基址暫存器BR內容由OS確定;A才是偏移量。
——可以複習第45點筆記兩種基址定址方式。
(3)變址定址(處理陣列,迴圈程式)
EA=(IX)+A,變址暫存器可由使用者改變,A不變(作起始地址);(IX)才是偏移量。
相比之下,假設迴圈程式的陣列是基址定址,則需要很多條指令(每條指令一個偏移量A),所以變址這時就基址牛逼了。
51.超標量流水線
【定義】一個時鐘週期內可以同時執行多條指令;
超流水線技術:一個時鐘週期內一個功能部件使用多次。
注意:流水線功能段的處理時間不變。
【408真題】若某計算機最複雜指令的執行需要完成5個子功能,分別由功能部件A~E實現,各功能部件所需時間分別為80ps、50ps、50ps、70ps和50ps,採用流水線方式執行指令,流水線暫存器延時為20ps,則CPU時鐘週期至少是(100ps)
【解析】時鐘週期以流水線各功能段的最長執行時間為準,題中指令流水線的指令需要用到A~E五個部件,所以每個流水段時間應取最大部件時間80ps,此外還有暫存器延時20ps,則CPU時鐘週期至少是100ps。
指令的四個週期是:取指、間址、執行和中斷週期(4個機器週期)。
52.OFFSET
【2019年408】OFFSET=目標地址-(PC+5)=0040 1000H-(0040 1025+5H)=FFFF FFD6H,
-2A即-42,然後求-42的補碼為FFFF FFD6。
【2013年408】首先要將指令中最右邊的8位(OFFSET)11100011即E3H進行符號擴充套件(負數補碼,填充1)變成FFE3H,再代入題目的轉移目標地址公式:(PC)+2+2 × OFFSET。
【2010年408】此題相對定址不是平時簡單的“EA=(PC)+A,(A指指令上的偏移量offest)”
——此處的偏移量位數確定:此題的表格最右下角可以看出是(PC)+(Rn),而Rn在表格首行有說是暫存器。
【2014年408】求bne指令的OFFSET欄位值
已知bne指令採用相對定址方式,當前PC內容為bne指令地址,bne指令的轉移目標地址計算公式。
bne指令的機器程式碼後2B的內容:OFFSET=FFFAH(補碼),真值為-6。
快法:FFFAH+0006H=(1)0000H,故FFFAH對應真值為-6.
【轉移指令轉移地址】目的地址=(PC)+指令字長+k×OFFSET(OFFSET≠總偏移量)
系統執行到bne指令時,PC的內容為0804 8118H,而跳轉的目標是0804 8100H,兩者相差了18H(即24個單位)的地址間隔
24的計算過程:因為0804 8100H=0804 8114H+4(個地址單位)+k×(-6)
所以k×(-6)=08048100H - 08048118H=-18H=-(1×16^1+8×16^0)=-24,即k=4
偏移地址的一位即是真實跳轉地址的-24/-6=4位。
所以:bne指令的轉移目標地址=(PC)+4+OFFSET×4(此處的OFFSET代表要偏移的指令的數量)
【錯法】由於要先求0804 8100H - 0804 8118H,這裡的地址是無符號數,且計算機求無符號數的減法是x+【y補】,所以就先求0804 8118H的補碼(數)
【錯因】(無符號數的減法理解沒錯,站在人理解角度也是用8100H減8118H,但是這裡的目標地址是“結果”,即在計算機內部是(PC)+指令字長+k×OFFSET去求得目的地址的)
53.週期挪用(竊取)
【單字傳送方式】每個字傳送完後CPU可以訪問主存,
——如週期挪用由DMA控制器挪用k個主存週期來訪問主存,傳送完一個資料字後立即釋放匯流排。
【單塊傳送方式】停止CPU訪存是在整個資料塊的傳送過程中,徹底讓CPU脫離匯流排(停止訪問主存)
DMA傳送方式注意折中型別的【週期竊取】,其實質是“CPU不在訪存時,I/O裝置便佔用”。
【2020年408】若裝置採用週期挪用 DMA 方式進行輸入輸出,每次 DMA 傳送的資料塊大小為 512位元組,相應的 I/O 介面中有一個 32 位數資料緩衝暫存器,對於資料輸入過程,下列敘述中錯誤的是:C
A、每準備好 32 位資料,DMA 控制器就發出一次匯流排請求;
B、相對於 CPU,DMA 控制器的匯流排使用權的優先順序更高;
C、在整個資料塊的傳送過過程中,CPU 不可以訪問主儲存器;
D、資料塊傳送結束時,會產生“DMA 傳送結束”的中斷請求。
【解析】由資料緩衝暫存器位數知道,這裡的上面說的一個資料字即32位的資料;
週期竊取CPU的一個或多個存取週期,而一個DMA傳送的資料塊大小為512B=512/4個字,即在整個塊的傳送過程中,傳送完一個字後釋放匯流排【單字傳送方式】。
相比之下,【停止CPU訪存】是在整個資料塊的傳送過程中,徹底讓CPU脫離匯流排(停止訪問主存)。
【注意】這裡的A是正確的!!!!。
54.2處替換演算法
(1)OS在虛擬地址轉換中訪問頁表,若缺頁且記憶體無空閒頁框則利用替換演算法置換頁面。
(2)CPU發出主存地址(實體地址)後,
判斷該儲存字是否在記憶體中:
——若命中則直接根據塊內地址,訪問塊內相應內容;
——若不命中,則
———(1)訪存,將該【字】傳送給CPU;
【CPU和Cache都和主存建立了直接訪問的通路】
———(2)要將該字所在的主存塊裝入Cache(如果此時Cache已裝滿,就用替換演算法騰出空位才能調入新的主存塊)。
【當Cache不命中後,CPU直接訪問主存拿到資料,不需要調入後再次訪問需要的資料】
55.Cache訪問效率
【Cache的命中率】CPU欲訪問的資訊已經在Cache中的比率;
PS:預設為Cache和主存同時訪問。
【第一步】設一個程式執行期間,Cache的總命中次數為Nc,訪問主存的總次數為Nm,
則【Cache的命中率】H=Nc/(Nc+Nm)
【第二步】設tc為命中時Cache的訪問時間,tm為未命中時的訪問時間,則Cache-主存系統的平均訪問時間Ta=Htc+(1-H)tm
【第三步】Cache系統的訪問效率e=tc/Ta
【典例】CPU 執行一段程式時, cache 完成存取的次數為5000次,主存完成存取的次數為200次。已知 cache 存取週期為40 ns ,主存存取週期為160 ns 。求:
1.Cache 命中率 H ,2.平均訪問時間 Ta,3.Cache /主存系統的訪問效率 e 。【答案26/29】
注意:看清題目是否求指令Cache的命中率:
【2014年408】指令 Cache 的命中率為:(1000×6-1)/(1000×6)=99.98%。 ——一定注意要乘6,(每次迴圈要讀6條指令,每讀一條指令都要訪Cache一次)。
https://andyguo.blog.csdn.net/article/details/106559830
指令Cache和資料Cache分離後的資料Cache=標記陣列+資料(而不是隻有資料),而此題並沒給出主存和Cache的對映關係,所以標記陣列不用求,另外資料區這裡指指令Cahce+資料Cache。
56.動態重定向
注意:【分頁分段】雖然是一次性將作業全部裝入記憶體,【靜態重定向】是作業裝入時一次性分配所有的記憶體空間,但分頁屬於動態重定向——頁式儲存不是像固定分割槽分配(靜態重定向)是用連續空間,即分頁的作業一次性裝入是離散地裝入,因而要把相鄰邏輯地址對映到不同實體地址要用到動態重定位。
57.RAW
RAW(read after writing)寫後讀。(直接上av畫質題)
詳細流水線複習回顧(https://andyguo.blog.csdn.net/article/details/106559830)
【寫後讀RAW】字面理解應該是先寫入再讀取,而現在是沒有寫入就已經讀了(即讀了舊資料),出錯。
58.有效控制訊號
(1)一般在問節拍安排時一起要寫,簡單的如R1out,MARin,特別注意涉及記憶體的,如M(MAR)->MDR對應是MemR,MDRinE這種(具體細節看題目)——MenR是要讀主存相應資料,MenW是寫入主存相應位置,括號內即為寫入地。
(典例2009https://andyguo.blog.csdn.net/article/details/106933503)
(2)如加法運算完的有效控制訊號要另外加上“add”,還有一些易錯點:
(3)09那題一開始沒有將(R1)放入MAR,而錯誤將ad(IR)送入MAR——這樣做的前提是取的指令的格式是【直接定址】,即指令的地址碼是【運算元的地址】。(順便可複習下——如果是立即定址,指令的地址碼則是運算元,操作姿勢:取指後,ad(IR)->R1,如果後面是ACC和(R1)相加則(ACC)+(R1)->R2,;
如果是暫存器間接定址,則暫存器裡存放的是主存地址,別漏了送地址到MAR:(R1)->MAR,M(MAR)->MDR)
(4)沒有意識到MAR的內容不變(一直是R1暫存器放的一個記憶體地址)
(5)最後存回記憶體的R1的data忘記先存入MDR
(6)運算過程不用寫出ALU,直接寫輸入和輸出:(R0)+(A)->AC。
(7)控制訊號的順序寫反。
59.變長運算元n
【最快方法】設有C條單地址(運算元)指令,【(2^8-m)×2^6-C】×2^6=n,解得C即可。
60.VRAM
顯示器中VRAM的容量=行解析度×列解析度×色深。
【栗子】某計算機的視訊記憶體容量=8MB,採用2048×1024解析度,則每個畫素最多可以使用的顏色數是(4G)
【解析】色深=(8M×8b)/(2048×1024)=32位,所以顏色種類=2^32=4G。
61.按位與&
若使用二級頁表的分頁儲存管理方式,邏輯地址結構為
頁目錄號(10位) | 頁表索引(10位) | 頁內偏移量(12位) |
設邏輯地址為LA,請分別給出其對應的頁目錄號和頁表索引的表示式。
頁目錄號可表示為(((unsigned int)(LA))>>22)& 0x3FF
頁表索引可表示為(((unsigned int)(LA))>>12)& 0x3FF
注:可用“無符號右移動>>”和“按位與&”操作取出某幾個二進位制位的值。
如01101101,00000000右移動——高位用0補齊,右邊8位全捨去,LA>>8
得00000000,01101101,LA>>8
1111 1111 0xFF(按位與&:只有對應位都為1時“與”結果才為1)
結果是 01101101
62.可見的暫存器
彙編程式設計師可見:通過彙編程式對某暫存器進行訪問。
(1)可見:PC、通用暫存器組、PSW;
(2)不可見:IR、MAR、MDR、暫存暫存器。
63.返回值
返回值是根據二進位制串(機器數)的解釋。
-
int f1(unsigned n){
-
int sum=
1,power;
-
for(
unsigned i=
0;i<n
-1;i++){
-
power *=
2;
-
sum += power;
-
}
-
return sum;
-
}
問:f(n)=
將f1中的int都改成float,可得到計算f(n)的另一個函式f2,f1(23)和f2(23)的返回值是否相等?機器數各是什麼?(用十六進位制表示)
【解析】返回值相同。因為f(23)=2^(23+1) -1=2^24 -1,其二進位制形式為24個1,即機器數為00FF FFFFH,int佔32位所以沒有溢位。float有1個符號位,8個指數位,23個底數位,並且隱含一位,所以23個底數位可以表示24位的底數。
求f2(23)機器數:因為符號位為0,指數位為23+127=150的二進位制為1001 0110,底數位為23個1即111 1111 1111 1111 1111 1111,所以f2(23)的機器數為0100 1011 0111 ...(20個1),十六進位制表示為4B7F FFFFH。
64.
相關文章
- 在計算機組成原理中x,計算機組成原理計算機
- 計算機組成原理計算機
- 計算機組成原理 - 計算篇計算機
- 【重學計算機】計算機組成原理計算機
- 計算機組成原理期末考試題計算機
- 計算機組成原理-全套影片教程計算機
- 計算機組成原理——I/O通道計算機
- 計算機組成原理核心考點計算機
- 王道計算機組成原理筆記計算機筆記
- 【計算機組成原理】第6章 計算機的運算方法計算機
- 計算機組成原理-全套視訊教程計算機
- 計算機組成原理之記憶體計算機記憶體
- 計算機組成原理學習 Part 2計算機
- 計算機組成原理複習0625計算機
- 計算機組成原理之匯流排設計計算機
- 計算機組成原理學習 筆記一計算機筆記
- 計算機組成原理浮點數加減計算機
- 計算機組成原理常見英文縮寫計算機
- 計算機組成原理名詞指令縮寫計算機
- 計算機組成原理與介面技術(二)計算機
- 【軟測試】(兩)計算機組成原理-cpu計算機
- 計算機組成原理期末複習小結計算機
- 計算機組成原理基礎知識(一)計算機
- 2021 王道考研 計算機組成原理+習題講解計算機
- 計算機組成與系統結構 cache 原理與計算計算機
- 計算機科班生學計算機組成原理的意義何在呢?計算機
- 計算機系統的層次結構(計算機組成原理5)計算機
- 1.1計算機組成計算機
- 計算機組成原理01-系統概論計算機
- (計算機組成原理)RISC與CISC的區別計算機
- 計算機組成原理02-系統概論(下)計算機
- 計算機組成原理與介面技術筆記(一)計算機筆記
- 計算機組成結構計算機
- 計算機組成原理與作業系統 第二章 處理機組成與管理計算機作業系統
- 計算機組成原理縮寫以及概念整理(持續更新)計算機
- 1、計算機組成及其功能計算機
- 唐朔飛《計算機組成原理》第一章-計算機系統概論計算機
- 計算機組成與體系結構-CPU組成計算機