器調試指南)
做了這么多年計算機組成原理的課程設計和實驗輔導我越來越確定一件事微程序控制器實驗是整個課程里最容易被低估、也最容易翻車的一個實驗。說它容易被低估是因為原理課上的知識點就那幾條——微指令格式、微地址轉移、控制存儲器、時序系統(tǒng)聽起來很抽象但不算難理解說它容易翻車是因為一旦站到實驗平臺前面對密密麻麻的開關、指示燈和連線前期預習欠下的“理解債”會被加倍討回來。這篇文章想寫的不只是一份實驗步驟說明書而是把微程序控制器實驗從“原理”到“平臺”再到“排查”的完整鏈路梳理清楚給正在做實驗、準備期末考試或者打算考研復習的同學一個可以反復對照的參考。我會把重點放在三個地方微程序控制器的本質運行邏輯、教學實驗平臺上從頭到尾的實現(xiàn)流程、以及那些真正讓人卡住的經典問題和調試思路。如果你正在為“單總線CPU微程序控制器設計”這種綜合性實驗頭疼或者拿著使用手冊卻不知道第一步該按哪個鍵這篇文章應該能幫你省下大量翻手冊和試錯的時間。1. 微程序控制器實驗到底在做什么先搞懂CPU的“發(fā)號施令”機制很多同學一進實驗室就直接去連線和撥開關這是本末倒置。微程序控制器實驗的本質不是連線不是撥開關而是要你親手“寫出一套讓CPU聽話的控制邏輯”。在動手之前必須先想明白CPU里的控制器到底是干什么的。1.1 從一次“取指”看清控制器的工作流程計算機執(zhí)行任何一條機器指令都不是一步完成的而是被拆成一小步一小步的微操作。就拿最基礎的“取指令”來說CPU內部大致要發(fā)生這樣一串動作把程序計數(shù)器PC中的指令地址送到地址總線也就是PC輸出、地址寄存器MAR輸入發(fā)出讀信號存儲器根據(jù)地址取出指令代碼讀出的指令送到指令寄存器IR中暫存程序計數(shù)器加一為取下一指令做準備。這四步里每一步都有一個明確的“動作”這些動作就是微操作。而控制器的工作就是按照正確的順序、在正確的節(jié)拍里產生對應的微命令讓數(shù)據(jù)通路上的每一個部件知道“這一刻你該干什么”。這里的核心思維方式是把一條機器指令的執(zhí)行過程看成是一串微指令的有序執(zhí)行。一條微指令對應一個節(jié)拍內全部微命令的集合而若干條微指令按順序組合就完成了一條機器指令的功能。這個思想來自英國計算機科學家威爾克斯他提出用“存儲程序”的思路來替代復雜的硬邏輯電路——你不是用一堆門電路去做判斷和連線而是把控制信號預先“寫成”一串微指令存放在一個專門的存儲器里執(zhí)行時依次讀出來驅動數(shù)據(jù)通路。打個比方硬布線控制器像是一個用純機械方式運行的自動售貨機按鈕和出貨機構之間直接靠連桿傳動而微程序控制器像是一臺用“配方卡片”驅動的機器不同商品對應不同的卡片卡片上寫明每一步怎么操作機器只是忠實地讀取卡片并執(zhí)行。配方改起來容易機器本身不用換。1.2 微程序控制器與硬布線控制器兩種“發(fā)令槍”的差別計算機組成原理課程里一定會對比這兩種控制器實驗做完了這個對比會變得極其直觀。我整理了一個對照表也是期末經常考的歸納點對比項微程序控制器硬布線控制器實現(xiàn)方式控制信號預先寫成微指令存放于控制存儲器用組合邏輯電路直接產生控制信號指令修改修改微程序即可靈活性高需要修改電路成本高、周期長執(zhí)行速度每步都要訪問控制存儲器速度較慢硬件直接產生信號速度較快設計復雜度規(guī)則性強易設計、易維護邏輯復雜設計調試困難典型應用CISC類處理器中廣泛使用RISC類處理器較多采用成本與功耗控制存儲器占用面積大邏輯門數(shù)量多但無存儲開銷這個表背起來容易但實驗的體驗會讓你真正明白“規(guī)則性強、易設計”是什么意思。你在實驗平臺上寫一條微指令本質上就是在填寫一行由若干個字段組成的“配置項”每個字段控制一個部件的動作邏輯非常清楚。而如果你看到實驗平臺上那些復雜的門電路芯片想象一下把它們換成幾千個邏輯門來實現(xiàn)同樣的控制邏輯馬上就明白為什么微程序設計思想能大大降低控制器的設計門檻。1.3 實驗平臺的單總線結構如何影響指令執(zhí)行不少高校的微程序控制器實驗都基于“單總線CPU”模型這也是熱搜詞里反復出現(xiàn)“單總線cpu微程序控制器設計”的原因。所謂單總線就是CPU內部所有部件——寄存器、ALU、存儲器數(shù)據(jù)口、指令寄存器等——都掛到一組公共數(shù)據(jù)總線上任何一次數(shù)據(jù)傳送都必須經過這條總線。單總線結構有一個特別重要的約束同一時刻只能有一個部件向總線發(fā)送數(shù)據(jù)但可以有多個部件同時接收數(shù)據(jù)。這句話是實驗中的“鐵律”。比如把R0的內容傳送到R1你必須先把R0的輸出門打開讓數(shù)據(jù)上總線同時讓R1的輸入時鐘有效總線上的數(shù)據(jù)才能被R1鎖存。如果這一刻R2的輸出門也被錯誤地打開了總線上的數(shù)據(jù)就會沖突結果完全是亂的。理解了這個約束你對“為什么一條微指令里很多控制信號是不能同時有效的”就有了直觀認識。微指令的設計與其說是在“寫命令”不如說是在“排交通”每個節(jié)拍只能安排一個數(shù)據(jù)源上總線但可以合理安排多個目的地同時接收。后面第3章講具體編寫時你會反復用到這條規(guī)則。2. 實驗環(huán)境與平臺準備部件、開關、手冊里最容易被忽略的細節(jié)微程序控制器實驗一般是在專用的教學實驗平臺上完成的。不同學校的平臺型號可能不同常見的有CO-2018型、COP2000型等但核心模塊大同小異。以CO-2018這類平臺為例你會在實驗箱面板上看到一堆功能模塊事先認識它們比拿著手冊臨時找開關要高效得多。2.1 教學實驗平臺的核心部件認識實驗平臺通常把CPU的各個組成部分拆成獨立模塊方便你直接觀察和手動控制。常見模塊包括寄存器組一般有R0、R1等通用寄存器有的平臺還有暫存器。注意區(qū)分寄存器的“輸出使能”和“寫入時鐘”這兩個信號分別控制數(shù)據(jù)的讀出和寫入是實現(xiàn)單總線隔離的關鍵。ALU完成算術邏輯運算比如加法、減法、與、或等。它的兩個輸入一般一個來自總線另一個來自鎖存器運算結果也送回總線。存儲器模塊包括存儲器芯片和地址寄存器MAR、數(shù)據(jù)寄存器MDR。讀寫信號需要手動或通過微指令控制。微程序控制部件這是實驗的核心區(qū)域一般包括微地址寄存器μPC或μAR、控制存儲器EPROM或SRAM、微指令寄存器μIR以及地址轉移邏輯。時序電路產生節(jié)拍脈沖常見的是T1、T2、T3之類的時鐘節(jié)拍用來同步微指令的執(zhí)行。輸入輸出開關和指示燈數(shù)據(jù)開關用來手動輸入數(shù)據(jù)或指令指示燈用來顯示總線數(shù)據(jù)、微地址、指令寄存器內容。千萬不要忽略任一模塊因為后續(xù)你寫的每一條微指令里的每一個字段都對應這些模塊的一個具體控制信號。一個最簡單的加法指令可能就要同時控制寄存器輸出、ALU運算、結果寫入等五六路信號。2.2 微指令字段的拆分與編碼方案談到微程序控制器就繞不開微指令的格式。一條微指令通常分成三個部分操作控制字段、判別測試字段、下地址字段。操作控制字段是最核心的部分它決定這個節(jié)拍里各個部件做什么動作。教材里講了三種編碼方式實驗平臺最常用的是“直接控制”和“字段譯碼”的折中方案。直接控制法微指令里每一位對應一個微命令比如第0位控制PC輸出、第1位控制MAR寫入等。優(yōu)點是直觀、速度快缺點是位數(shù)太多一條微指令會非常長。字段譯碼法把互斥的微命令分成一組用二進制編碼表示。比如控制“把哪個寄存器的值送到總線”這個動作可以直接用2位二進制編碼表示4個寄存器譯碼后產生對應的輸出信號。優(yōu)點是微指令大大縮短缺點是譯碼電路有延遲。混合編碼法不互斥的、要求并行執(zhí)行的信號用直接控制互斥的信號用字段譯碼。實驗平臺通常采用這種方式。寫實驗報告時老師特別希望看到你對編碼方案的分析為什么某些信號可以分組、某些不能核心判斷依據(jù)就是互斥性——如果兩個微命令絕不可能在同一個節(jié)拍同時出現(xiàn)它們就可以放在同一組里譯碼如果它們經常需要同時有效就必須各自獨立占位。比如寄存器R0和R1的“輸出到總線”是互斥的因為單總線同一時刻只允許一個寄存器輸出它們就可以編成一組而“PC輸出”和“PC加一”雖然都在取指周期出現(xiàn)但嚴格來說加一是對PC內部計數(shù)器的操作輸出是送到總線兩者并不互斥設計時要仔細分析。2.3 微地址生成邏輯計數(shù)器方式與斷定方式微程序是一條條按順序執(zhí)行的但和機器指令一樣它也有“順序執(zhí)行”和“跳轉”兩種流程。微地址的生成方式主要有兩種第一種是計數(shù)器方式。微程序按順序存放在控制存儲器中每執(zhí)行完一條微指令微地址自動加一指向下一條。取指周期完成后的微程序入口、不同機器指令加法、跳轉、傳送對應的執(zhí)行微程序入口都需要用某種方式跳轉過去這就要靠分支或轉移能力。第二種是斷定方式也叫下地址字段方式。每條微指令的下地址字段直接給出下一條微指令的地址或者通過某個判別條件決定下地址是A還是B。這種方式的好處是靈活每條指令都能顯式指定后繼地址代價是微指令長度增加。實驗平臺通常把兩種方式結合起來。微指令中有一個“判別測試字段P”根據(jù)某個條件比如當前操作的機器指令是什么、運算結果是否為0來決定下地址如何產生。這里的“條件”非常關鍵在取指周期結束后控制器必須根據(jù)IR中存放的機器指令操作碼跳轉到對應的執(zhí)行微程序入口這就是所謂“操作碼譯碼形成微程序入口地址”。2.4 動手前必須完成的“靜態(tài)檢查”清單去實驗室之前先對照平臺手冊畫一張微指令格式表把每個字段的映射關系寫清楚。這一步看起來繁瑣但能避免你在平臺上對著手冊翻來翻去。我在實際操作中總結了一份“靜態(tài)檢查清單”每次實驗前都會過一遍連線是否完整檢查各模塊間的數(shù)據(jù)總線、控制信號線是否按實驗手冊要求接好有沒有松動或插反。開關初始狀態(tài)數(shù)據(jù)開關是否全部處于非選中狀態(tài)避免上電瞬間總線沖突。存儲器/微程序存儲器的寫保護狀態(tài)還沒到寫入步驟時一定確保讀寫開關處于“讀”的位置防止誤寫。時鐘源選擇是使用平臺內部連續(xù)脈沖還是手動單步脈沖調試階段強烈建議先選擇手動單步。復位狀態(tài)實驗箱上電后先做一次復位讓PC、μPC回到初始狀態(tài)。這一步被很多人跳過結果程序一啟動就跑飛。做完這五步再上電大概率能避開一半以上的低級問題。3. 從指令集到微程序一次算術指令的完整編寫過程解決了環(huán)境和理解問題下面進入核心怎么把一條機器指令變成一段能在實驗平臺上運行的微程序。我這里不針對某一款具體平臺的開關名寫死步驟那樣換個型號就不適用了而是講完整的實現(xiàn)思路你完全可以移植到自己的平臺和手冊上。3.1 先把指令周期拆成微操作序列假設要實現(xiàn)一條“加法指令”功能是把某個寄存器比如R0的值和另一個寄存器比如R1的值相加結果存回R0。機器指令會有一個操作碼假設叫ADD。在編寫微程序前先強制自己寫出一份完整的微操作序列這個過程叫“指令流程分解”。ADD指令的執(zhí)行可以分為兩個周期取指周期所有指令公用和執(zhí)行周期ADD專用。取指周期微操作序列T1PC輸出到總線MAR接收地址同時PC1。T2根據(jù)MAR地址讀存儲器MDR接收指令數(shù)據(jù)。T3MDR輸出到總線IR接收形成指令。執(zhí)行周期微操作序列ADD R0, R1T4R1輸出到總線ALU的A鎖存器接收。T5R0輸出到總線ALU的B鎖存器接收ALU執(zhí)行加法。T6ALU結果輸出到總線R0接收。這只是一個簡化模型實際實驗平臺可能還需要考慮暫存器、ALU輸入通路等細節(jié)但方法論是通用的。注意一個關鍵點每個微周期里總線上最多只有一個數(shù)據(jù)源。我在T4里讓R1輸出、同時ALU的A鎖存器接收是合理的如果我貪心想在同一拍里同時讓R1和R0都輸出總線就沖突了。這就是前面強調的單總線約束在實際設計中的體現(xiàn)。3.2 微程序的編寫與存儲有了微操作序列下一步就是把每一步轉換成一條微指令。你需要使用平臺手冊上的微指令格式比如“控制字段判別字段下地址字段”逐條填寫。以取指周期第一條微指令為例它需要完成的動作是“PC→MAR”PC內容送地址寄存器和“PC1”。填寫時就需要在相應字段里置上對應控制信號。再比如取指周期最后一條微指令“MDR→IR”除了要打開MDR的輸出門和IR的寫入時鐘外還需要把判別字段P設置為“根據(jù)指令操作碼譯碼”下地址字段填寫默認的取下一條指令的入口地址或執(zhí)行微程序的首地址。這樣才能讓控制器在取指完成后自動跳轉到正確指令的執(zhí)行微程序去。這里有個設計上的常見技巧所有機器指令的取指微程序通常是公用的。也就是說不管是什么指令取指都走同樣一段微程序差別只在取指結束后的跳轉目標不同。你可以把取指微程序放在控制存儲器的固定地址區(qū)然后各條指令的執(zhí)行微程序分散在不同區(qū)域通過操作碼譯碼跳轉過去。這樣設計的好處是省空間、結構清晰寫實驗報告時也是加分項。微程序編寫完成后還需要手工或通過軟件工具生成對應的二進制代碼然后寫入控制存儲器。教學平臺一般支持兩種方式一種是手動撥動數(shù)據(jù)開關逐條寫入另一種是借助PC端軟件將微程序代碼下載到實驗平臺的存儲芯片中。能用軟件下載就盡量用軟件效率高得多也方便反復修改。3.3 運行與調試單步執(zhí)行、信號觀測、結果驗證微程序寫入后就可以運行調試了。調試順序有講究千萬別一上來就連續(xù)運行。第一步是“單微周期執(zhí)行”。把時鐘調到單步模式每按一次按鈕控制器只執(zhí)行一條微指令。觀察面板上的微地址顯示看它是否按預期遞增或跳轉。如果微地址走的不是你設計中的順序立刻就能發(fā)現(xiàn)不需要等整個程序跑完再猜哪里錯了。第二步是“單指令執(zhí)行”。在微周期正常的前提下?lián)苋胍粭l機器指令比如ADD讓控制器完成完整的取指和執(zhí)行周期觀察指令寄存器IR的內容、總線上每一步傳的數(shù)據(jù)、ALU的運算結果。第三步才是“連續(xù)運行”或“多指令運行”。此時如果結果出錯大部分情況是微操作的時序問題或者某個控制信號沒被正確置位。我調試時最愛看的是總線和微地址兩組指示燈??偩€指示燈直接反映每個節(jié)拍到底哪個部件的數(shù)據(jù)被送到了總線上微地址則反映控制流程走的是不是預期路線。兩者結合基本能把絕大多數(shù)邏輯錯誤定位到某一條微指令上。4. 實驗中的經典問題排查計數(shù)器、時序、總線沖突做微程序控制器實驗崩潰的瞬間往往不在編寫階段而在運行階段。下面幾個問題是我?guī)嶒炛杏龅阶疃嗟囊彩撬阉鳌坝嬎銠C組成原理實驗計數(shù)器”“單總線CPU”時最常被問到的類型我把完整的排查鏈路寫出來供你調試時對照。4.1 微指令計數(shù)器不遞增的排查鏈路現(xiàn)象按下單步執(zhí)行按鈕微地址顯示始終不變或者一直停在同一個地址。排查第一步檢查時鐘是否有效到達μPC。微程序計數(shù)器是在時鐘邊沿觸發(fā)遞增的如果時鐘信號沒接上或者被短路到地計數(shù)器自然不動。用示波器或者平臺上的時鐘指示燈確認手動單步時每按一次按鈕應該能看到一個脈沖。排查第二步檢查復位信號是否持續(xù)有效。很多平臺有一個全局復位開關它會讓μPC清零。如果復位開關沒有彈起或者復位信號被某個跳線強制拉低μPC就會被反復清零看起來就像“完全不遞增”。這也是為什么我強調上電后先做一次復位再開始同時確保復位狀態(tài)已經解除。排查第三步確認中斷或暫停信號沒有生效。有些平臺有暫停/運行控制邏輯微地址生成邏輯中有等待信號。如果某個判別條件一直滿足暫停請求控制器會一直停在當前微周期。把判別測試字段清掉或者讓相應條件失效再試一次。排查第四步重點確認微地址字段本身沒寫錯。不少同學把微指令的下地址字段算錯或者填錯導致控制器其實在執(zhí)行跳轉指令但跳轉目標還是當前地址看起來跟“沒遞增”一樣。把這條微指令的下地址字段單獨提取出來和當前微地址做比較手工推導一遍排除這類低級的邏輯錯誤。4.2 總線沖突多個部件同時輸出的根源現(xiàn)象總線指示燈出現(xiàn)多位同時為1或者看起來像“疊加”的亂碼ALU結果寄存器里存儲的值忽對忽錯??偩€沖突的本質只有一個同一時刻有多個部件的輸出使能同時有效都在往總線上灌數(shù)據(jù)。在單總線結構里數(shù)據(jù)總線是共享的多個輸出驅動同一組線結果既不是A也不是B而是電氣上的疊加無法得到任何邏輯值。排查思路從微指令本身入手。調出當前微周期的控制字段看看哪些輸出門信號被置成了有效狀態(tài)。我曾經遇到過一個同學他設計時想把R0的數(shù)據(jù)送給ALU又把R1的數(shù)據(jù)送給ALU“準備下一次運算”結果一條微指令里同時打開了兩個寄存器的輸出開關總線立刻沖突。要避免這個問題動手寫微指令之前就要給自己立一個規(guī)定每寫一條微指令先用偽代碼把總線上傳輸?shù)臄?shù)據(jù)流畫出來只允許一個“源”箭頭指向總線但可以有多個“目的”箭頭從總線引出。一條微指令里出現(xiàn)兩個及以上源箭頭就要立刻修改。4.3 實驗計數(shù)器模塊的觀測與微程序地址顯示熱搜詞里的“計算機組成原理實驗計數(shù)器”其實包含了兩個不同的東西很多初學者容易混淆。一個是程序計數(shù)器PC記錄的是正在執(zhí)行的機器指令的地址另一個是微程序計數(shù)器μPC或微地址寄存器記錄的是當前微指令在控制存儲器中的位置。實驗平臺面板上通常都有這兩個計數(shù)器的顯示區(qū)域做實驗時一定要分清楚。調試時你會發(fā)現(xiàn)執(zhí)行一條機器指令PC可能只加了1取指完成后加1但μPC卻走過了好幾步取指周期有3條微指令執(zhí)行周期又有好幾條微指令。這就是“兩級編程”的體現(xiàn)機器指令層和微指令層是兩層不同的地址空間。很多同學在實驗報告里把PC的值和微地址混著寫結果時序圖完全對不上。我建議畫時序圖時用兩條獨立的時間線分別標注PC和μPC的變化層次一目了然。還有一個容易踩的坑有些實驗平臺為了演示方便把PC也做成了可以手動置數(shù)的并且在取指時不自動加一需要你用一條專門的微指令去執(zhí)行PC加一操作。這意味著每條指令的取指微程序里都必須包含PC1這個微操作漏了它程序就會反復讀取同一條指令形成死循環(huán)。這種設計在實際CPU里很少見但在教學平臺中很常見一定要看手冊確認。4.4 指令執(zhí)行結果不正確從時序到控制的細致排查如果總線沒沖突、微地址也對但最終結果還是不對那問題可能出在部件的工作時序上。舉個例子寄存器寫入通常要求數(shù)據(jù)在總線上穩(wěn)定建立一段時間然后在時鐘邊沿打入如果數(shù)據(jù)還沒穩(wěn)定就發(fā)寫入信號寫入的內容自然不對。這類問題的排查方法只有一個逐節(jié)拍核對。把仿真波形或者平臺指示燈顯示的數(shù)據(jù)和你在紙上推演的微操作序列一行一行對。重點檢查三處數(shù)據(jù)送入的鎖存/打入信號是否早于數(shù)據(jù)有效部件的輸入源是否選對了運算結果輸出是否有足夠的建立時間被下一級接收。實驗平臺的節(jié)拍發(fā)生器是固定的你能調整的其實是微指令內部的信號安排——盡量把數(shù)據(jù)源信號的起始時間提前把接收信號的時刻放在節(jié)拍后沿這樣能爭取更多的建立時間。5. 從實驗到考試期末與考研繞不開的幾個核心考點既然做到這個實驗了肯定繞不開期末考試和考研。很多同學實驗做完就丟到一邊其實實驗里那些操作細節(jié)恰恰是考題的絕佳素材。我根據(jù)帶學生復習的經驗把實驗對應的考點拎出來串一遍幫你實現(xiàn)“實驗報告”與“試卷得分”之間的轉化。5.1 微指令格式與編碼方式的對比題期末考試最基礎的一類題是給出一條微指令的二進制編碼讓你指出每一個字段的含義或者反過來給你一條機器指令的微操作序列讓你編寫對應的微指令編碼。這類題考察的就是你對微指令格式的熟悉程度。做題時注意幾點看清楚題目用的是直接控制還是字段譯碼如果用了字段譯碼要知道譯碼器的輸入編碼與輸出信號的對應關系下地址字段多少位能尋址多大范圍的控制存儲器。這些在實驗中都親手填寫過做題時會很有畫面感。5.2 微地址轉移的常見考法考研題和期末大題更喜歡的考法是給出控制存儲器的容量、微指令格式中判別測試字段的位數(shù)、下地址字段的位數(shù)讓你計算能容納多少條微指令、最多有多少個判別分支或者給出一段帶條件跳轉的微程序流程讓你標出每條微指令的下地址。這類題的核心在于理解判別測試字段如何影響微地址生成。常見的硬件邏輯是當判別測試字段無效時下地址直接等于“下地址字段內的值”當判別測試字段有效時根據(jù)條件從“下地址字段的值”和“某個固定分支地址”中選擇一個。做題時要把這兩種情況分開討論。實驗里你跳轉到各指令執(zhí)行微程序入口的操作本質上就是這個機制的硬件實現(xiàn)。5.3 把實驗報告寫成加分項的技巧最后給寫實驗報告的同學一點建議。實驗報告不只是記錄你做了什么更是向老師證明你“想清楚了”。我建議報告里包含這五部分微程序設計方案畫出指令流程分解圖標出每條微指令的微操作和所用節(jié)拍。微指令編碼表用表格列出每條微指令的控制字段、判別字段、下地址字段及對應二進制編碼。關鍵信號時序說明挑一兩條關鍵微指令說明為什么這個節(jié)拍安排這些微操作尤其要解釋總線數(shù)據(jù)流的單源原則。調試過程與問題記錄記錄你遇到的卡點、排除思路和最終解決方式。這部分是老師最看重的真實記錄比“一切順利”有價值得多。優(yōu)化思考如果你能提出對該微程序設計的簡化方案或者指出當前設計的不足報告會明顯上一個檔次。每次帶學弟學妹做這個實驗我都會讓他們先合上手冊用白紙把“取指周期三條微指令”默寫出來。能默寫出來后面所有的操作都順理成章默寫不出來在實驗箱前看再久也是瞎猜。這個習慣我也建議你試試。微程序控制器實驗最有意思的地方就是它把教材上最抽象的“控制”二字變成了一條條你能親手指定的微指令和能親眼看到的總線數(shù)據(jù)流。一旦你真正看懂了一條機器指令是如何被微程序一步步“翻譯”并執(zhí)行的計算機組成原理這門課最難的那道坎就算徹底邁過去了。