盛羽,余進(jìn),陳松喬,王建新
(中南大學(xué) 信息科學(xué)與工程學(xué)院,湖南 長(zhǎng)沙,410083)
基于CPU仿真器的匯編語言學(xué)習(xí)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
盛羽,余進(jìn),陳松喬,王建新
(中南大學(xué) 信息科學(xué)與工程學(xué)院,湖南 長(zhǎng)沙,410083)
提出一種基于CPU仿真器的匯編語言學(xué)習(xí)系統(tǒng)設(shè)計(jì)模型和實(shí)現(xiàn)方法。該系統(tǒng)利用JavaBean組件技術(shù)實(shí)現(xiàn) CPU的仿真;結(jié)合多線程技術(shù)和鎖機(jī)制實(shí)現(xiàn)組件的數(shù)據(jù)觸發(fā)式調(diào)度機(jī)制,有效地解決了具有復(fù)雜關(guān)系的組件之間的調(diào)度運(yùn)行問題,保證了微命令的有序執(zhí)行;基于脈沖信號(hào)的事件觸發(fā)機(jī)制,實(shí)現(xiàn)了微指令的單步調(diào)試;基于所設(shè)計(jì)的CPU仿真器指令系統(tǒng),采用現(xiàn)代編譯技術(shù)設(shè)計(jì)了一種匯編器,實(shí)現(xiàn)了CPU仿真器上匯編指令到機(jī)器指令的快速編譯。與已有的匯編語言學(xué)習(xí)系統(tǒng)相比,本系統(tǒng)不僅在通用性、交互性等方面都有較大提高,而且能形象直觀地展示虛擬寄存器等各個(gè)虛擬芯片的實(shí)時(shí)狀態(tài),記錄對(duì)應(yīng)的微指令流,從而更精確地監(jiān)視匯編指令在CPU仿真器中的執(zhí)行過程。
CPU仿真器;匯編語言;編譯技術(shù);微指令流
匯編語言是計(jì)算機(jī)相關(guān)專業(yè)的重要基礎(chǔ)內(nèi)容[1]。隨著信息技術(shù)的快速發(fā)展,各種高級(jí)語言和應(yīng)用開發(fā)環(huán)境日趨完善。但不容忽視的是:在各種消費(fèi)電子產(chǎn)品的內(nèi)核程序開發(fā)、通信底層協(xié)議開發(fā)及各種DSP應(yīng)用中,匯編語言繼續(xù)起著不可替代的作用[2]。匯編語言面向機(jī)器,它能夠?yàn)槌绦騿T操縱機(jī)器硬件系統(tǒng)提供最直接的途徑,而且可以使程序員編寫出在“時(shí)間”和“空間”2個(gè)方面最具效率的程序[3]。但在實(shí)際教學(xué)中,匯編語言一直是個(gè)難教難學(xué)的課程[4?5]。究其原因,主要有以下3個(gè)方面:首先,匯編語言教學(xué)重點(diǎn)之一是特定處理器結(jié)構(gòu)的介紹[6],然而,真實(shí)處理器的內(nèi)部結(jié)構(gòu)對(duì)外界是不可見、透明的,僅僅通過文字描述和概念講解的傳統(tǒng)教學(xué)模式很難使學(xué)生對(duì)處理器的整體結(jié)構(gòu)產(chǎn)生直觀、感性的認(rèn)識(shí);其次,機(jī)器執(zhí)行匯編指令的過程,即指令的取指、譯碼、執(zhí)行全過程,也是個(gè)抽象的概念,難以理解[7];此外,目前比較好的匯編語言集成開發(fā)環(huán)境不多見,而通常上機(jī)環(huán)境中采用DOS命令行的操作方式十分煩瑣。因此,迫切需要一個(gè)易于操作、功能完善、交互性強(qiáng)、高度仿真的匯編語言學(xué)習(xí)平臺(tái)來輔助教學(xué)。目前,針對(duì)匯編語言的各類學(xué)習(xí)平臺(tái)正在不斷開發(fā)和研究中,并取得了一定的成果。文獻(xiàn)[8]給出了基于多媒體與WEB技術(shù)的計(jì)算機(jī)結(jié)構(gòu)與匯編語言CAL系統(tǒng),該系統(tǒng)利用FLASH技術(shù),能較好地演示指令運(yùn)行過程中的數(shù)據(jù)流動(dòng),但其缺點(diǎn)是不支持用戶輸入和運(yùn)行自己的程序,交互性較差;文獻(xiàn)[9?12]介紹了基于軟件仿真技術(shù)的可視化匯編語言學(xué)習(xí)平臺(tái),它們針對(duì)特定處理器上的指令集進(jìn)行了仿真,并且具有較好的交互性和可視化,但它們都沒能在微指令級(jí)對(duì)指令功能進(jìn)行分解,因此,無法對(duì)指令的執(zhí)行流程作微指令級(jí)的單步調(diào)試;文獻(xiàn)[13]介紹了基于Web的匯編語言仿真實(shí)驗(yàn)系統(tǒng),該系統(tǒng)為用戶提供了有針對(duì)性特點(diǎn)的示例程序,并支持用戶輸入程序。此外,Emu8086公司的emu8086以及文獻(xiàn)[14]中提到的Sim8086仿真了Intel8086處理器,支持8086匯編語言程序的調(diào)試運(yùn)行。雖然這些仿真軟件針對(duì)特定處理器實(shí)現(xiàn)了匯編語言仿真,但是,它們僅通過寄存器數(shù)據(jù)變化來描述指令執(zhí)行效果,而沒有對(duì)處理器其他重要部件(如控制器等)進(jìn)行描述,因此,無法體現(xiàn)指令控制下處理器內(nèi)部數(shù)據(jù)的流動(dòng)與處理過程。鑒于現(xiàn)有匯編語言學(xué)習(xí)環(huán)境中存在的不足,本文作者提出基于 CPU仿真器(CPU_Simulator)的匯編語言學(xué)習(xí)平臺(tái)ASMLL。ASMLL模擬了CPU的內(nèi)部器件及其運(yùn)行機(jī)制,提供了該CPU仿真器上的指令系統(tǒng)SML,同時(shí)實(shí)現(xiàn)了一個(gè)集匯編語言源程序編輯、匯編、調(diào)試功能于一體的學(xué)習(xí)支撐環(huán)境。本平臺(tái)最大的特點(diǎn)是在指令調(diào)試過程中能對(duì)微指令流程進(jìn)行記錄,并實(shí)時(shí)觀察處理器內(nèi)部器件的結(jié)構(gòu)及其狀態(tài)的變化,讓學(xué)習(xí)者真正體會(huì)和理解匯編指令對(duì)硬件的控制作用。
ASMLL的系統(tǒng)架構(gòu)如圖 1所示。系統(tǒng)采用 B/S模式開發(fā),客戶端和服務(wù)器通過互聯(lián)網(wǎng)進(jìn)行通信連接。Web服務(wù)器端主要提供已編譯好的Java類文件,并且根據(jù)用戶的請(qǐng)求將JavaBean組件和普通Java類文件傳給客戶端。CPU_Simulator所需的虛擬器件以JavaBean組件的方式封裝,存于服務(wù)器端的組件庫中,實(shí)驗(yàn)配置文件庫用于存儲(chǔ)CPU_Simulator裝配文件,資源文件庫用于存儲(chǔ)相關(guān)的資源文件。
客戶端主要提供匯編語言源程序的編輯、編譯環(huán)境和目標(biāo)程序的調(diào)試、運(yùn)行服務(wù)??蛻舳瞬捎脼g覽器中嵌入Java Applet的方式,用戶可以通過客戶端提供的菜單欄、代碼編輯窗口、調(diào)試控制窗口、程序流程記錄窗口、CPU_Simulator窗口等,方便地創(chuàng)建、編輯和保存匯編語言源文件,編譯加載源文件,調(diào)試運(yùn)行目標(biāo)程序并觀察CPU_Simulator的圖形結(jié)構(gòu)及其運(yùn)行狀態(tài)。整個(gè)系統(tǒng)具有良好的交互性、實(shí)時(shí)性和靈活性。
圖1 ASMLL的系統(tǒng)架構(gòu)Fig.1 System architecture of ASMLL
圖2 ASMLL的功能模塊Fig.2 Function modules in ASMLL
平臺(tái)的功能模塊如圖2所示。ASMLL主要由編譯加載、調(diào)試控制、CPU_Simulator三大模塊構(gòu)成。編譯加載模塊主要為用戶提供匯編語言源程序到目標(biāo)程序的匯編功能和目標(biāo)程序到CPU_Simulator的加載服務(wù)。調(diào)試控制模塊主要在微指令級(jí)別對(duì)目標(biāo)程序進(jìn)行單步調(diào)試、對(duì)寄存器狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控。CPU_Simulator模塊主要為目標(biāo)程序提供模擬運(yùn)行環(huán)境,采用Java2D技術(shù)為用戶提供機(jī)器內(nèi)部各個(gè)單元部件的可視化視圖。
整個(gè)系統(tǒng)的處理過程如下:用戶使用代碼編輯窗口創(chuàng)建匯編語言源程序后,通過內(nèi)置的匯編器對(duì)其進(jìn)行編譯,并通知CPU_Simulator加載匯編出的目標(biāo)程序;CPU_Simulator收到通知后,將目標(biāo)程序加載到虛擬內(nèi)存器件中,并等待調(diào)試控制模塊發(fā)出控制信號(hào);調(diào)試控制模塊通過命令接口通知脈沖發(fā)生器產(chǎn)生脈沖,引導(dǎo)程序進(jìn)入調(diào)試運(yùn)行狀態(tài),并接收虛擬器件傳回的反饋信息,將實(shí)時(shí)狀態(tài)在界面上顯示。
仿真器是一種用以模擬程序在目標(biāo)芯片上運(yùn)行情況的工具,它執(zhí)行用戶輸入的源程序,能較為逼真地模擬出程序在芯片上的運(yùn)行效果?,F(xiàn)在的仿真器主要分為硬件仿真器與軟件仿真器兩大類,而軟件仿真器又可細(xì)分為結(jié)構(gòu)仿真器與指令仿真器[15]。對(duì)CPU_Simulator進(jìn)行結(jié)構(gòu)仿真,由它來提供匯編語言程序的運(yùn)行環(huán)境。由于CPU_Simulator主要由微程序控制器、時(shí)序系統(tǒng)、運(yùn)算器和存儲(chǔ)器等功能部件構(gòu)成,每個(gè)部件又由類型多樣、顆粒度更小的芯片構(gòu)成,采用怎樣的芯片模型對(duì)這些芯片的物理結(jié)構(gòu)和邏輯功能進(jìn)行統(tǒng)一描述和管理,以及如何保證機(jī)器指令在眾多芯片中有序執(zhí)行成為該模塊設(shè)計(jì)的難點(diǎn)。
結(jié)合Java2D技術(shù)和JavaBean組件技術(shù)構(gòu)造了可視化組件DeviceCarrier。該組件定義了虛擬芯片共同的屬性和行為,芯片的長(zhǎng)寬、名稱、位置以及表示輸入與輸出數(shù)據(jù)的引腳等屬性,同時(shí)提供了這些屬性的讀寫接口與2D繪圖接口。以DeviceCarrier為芯片父類,在開發(fā)具體芯片對(duì)象時(shí)只需增加組件的特有屬性和功能方法來實(shí)現(xiàn)其內(nèi)部邏輯功能。當(dāng)芯片組件加載時(shí),運(yùn)行面板上將繪出其物理形態(tài);當(dāng)芯片組件從引腳處獲得控制信號(hào)與數(shù)據(jù)時(shí),它將調(diào)用相應(yīng)功能方法進(jìn)行數(shù)據(jù)處理并產(chǎn)生輸出。這樣,芯片組件在結(jié)構(gòu)、功能和信號(hào)傳遞方式上都對(duì)硬件芯片進(jìn)行模擬,從而達(dá)到了一個(gè)很好的仿真效果。
以 CPU_Simulator中的微控制存儲(chǔ)器組件MicroControl為例。SML指令集中的每條指令被譯成微指令,形成各自的一段微程序后保存在MicroControl中。經(jīng)譯碼器組件譯碼后,這些微指令產(chǎn)生的微控制信號(hào)可控制CPU_Simulator內(nèi)部數(shù)據(jù)的傳遞,進(jìn)而完成對(duì)應(yīng)指令的功能。其中,MicroControl的具體工作為:首先根據(jù)外部輸入信息(如機(jī)器指令,節(jié)拍脈沖,執(zhí)行部件反饋的狀態(tài)標(biāo)志等),MicroControl產(chǎn)生微地址,然后從該微地址處讀取相應(yīng)的微指令并輸出到譯碼器組件,同時(shí)生成后繼微指令地址。由于微控制存儲(chǔ)器工作時(shí)具有很強(qiáng)的時(shí)序性,在CPU_Simulator中,以時(shí)鐘電路組件的T2和T4脈沖引腳端的輸出作為MicroControl的脈沖輸入,來實(shí)現(xiàn)微控制存儲(chǔ)器組件的時(shí)序功能。在繼承DeviceCarrier后,MicroControl組件采用一個(gè)整型的二維數(shù)組來存儲(chǔ)微程序,其中一維用來記錄微指令地址,二維用來記錄微指令,而微控制存儲(chǔ)器組件的內(nèi)部邏輯功能則交由control( )方法來實(shí)現(xiàn)。MicroControl的主要實(shí)現(xiàn)代碼如下所示:
CPU_Simulator由大量具有獨(dú)立邏輯功能的芯片組件按照一定的數(shù)據(jù)通路構(gòu)成。芯片間控制信號(hào)與數(shù)據(jù)的傳遞不是單純的并行或串行。如何描述組件間的連接關(guān)系和調(diào)度機(jī)制,從而保證CPU_Simulator運(yùn)行的正確性和穩(wěn)定性是整個(gè)仿真設(shè)計(jì)的關(guān)鍵。
2.2.1 組件連接關(guān)系
組成CPU_Simulator的絕大多數(shù)組件都是多輸入多輸出接口,導(dǎo)致了組件的連接關(guān)系復(fù)雜。本文采用組件自我記錄的方式,為每個(gè)組件定義一張連接關(guān)系表 ConnectTable,用于記錄其輸出引腳上的所有關(guān)聯(lián)組件信息。由于每個(gè)組件的輸出引腳個(gè)數(shù)不等,所以,采用初始為3的可動(dòng)態(tài)擴(kuò)展的二維數(shù)組表示,數(shù)組的元素是一個(gè)二元組(關(guān)聯(lián)組件,引腳),其中,表的一維代表組件的輸出引腳,二維代表組件的關(guān)聯(lián)信息。ConnectTable類定義了為指定的引腳新增連接信息、刪除連接信息和獲得其所有關(guān)聯(lián)組件信息的 3個(gè)方法,使表易于擴(kuò)充和維護(hù)。連接關(guān)系表有效地記錄了組件之間的復(fù)雜關(guān)系,使得CPU_Simulator在調(diào)度的過程中便于對(duì)引腳數(shù)據(jù)進(jìn)行實(shí)時(shí)、動(dòng)態(tài)的修改,同時(shí)為組件的調(diào)度控制提供依據(jù)。
2.2.2 組件的調(diào)度控制
CPU_Simulator可以看作是由多個(gè)功能獨(dú)立的虛擬元件通過數(shù)據(jù)流通道互聯(lián)構(gòu)成,其每個(gè)組件帶有若干輸入口和輸出口。組件的功能是將其輸入口的數(shù)據(jù)進(jìn)行變換后形成數(shù)據(jù)流從輸出口傳遞給與之關(guān)聯(lián)的其他組件。為協(xié)調(diào)控制各個(gè)組件的執(zhí)行次序,實(shí)現(xiàn)系統(tǒng)的并行性和實(shí)時(shí)性,本文采用基于多線程的數(shù)據(jù)觸發(fā)式調(diào)度機(jī)制來控制組件的執(zhí)行。
基于多線程的數(shù)據(jù)觸發(fā)式調(diào)度機(jī)制是把每個(gè)組件都作為一個(gè)線程,線程之間的通信采用 wait( )和notify( )機(jī)制和鎖機(jī)制來控制[16],線程之間的數(shù)據(jù)傳遞采用直接傳遞方式。初始化時(shí),每個(gè)組件會(huì)根據(jù)模型機(jī)內(nèi)部結(jié)構(gòu),建立自己的連接關(guān)系表。在運(yùn)行過程中,存儲(chǔ)在其引腳中的數(shù)據(jù)會(huì)隨著組件功能方法的執(zhí)行而動(dòng)態(tài)更新。組件產(chǎn)生的結(jié)果數(shù)據(jù)會(huì)根據(jù)連接關(guān)系表中的連接關(guān)系從輸出引腳傳送到與它相連的下一級(jí)組件的輸入引腳上。這種調(diào)度機(jī)制有效地保證了數(shù)據(jù)源不斷產(chǎn)生的信號(hào)都能被及時(shí)接收和處理的實(shí)時(shí)性。
具體過程如下:調(diào)度控制模塊把 CPU_Simulator中每個(gè)芯片組件構(gòu)造成一個(gè)線程對(duì)象,放到運(yùn)行隊(duì)列線程組中。在初始狀態(tài),所有組件的引腳值為空,標(biāo)志位為0。當(dāng) CPU_Simulator啟動(dòng)時(shí),所有線程以等概率的機(jī)會(huì)搶占CPU得到運(yùn)行權(quán),除了脈沖組件線程外,其他線程運(yùn)行時(shí)都會(huì)先調(diào)用wait( )方法使其處于等待狀態(tài)而迅速放棄CPU的使用權(quán),直到其上級(jí)線程調(diào)用 notify( )方法喚醒并驅(qū)動(dòng)它們運(yùn)行。按照這種調(diào)用過程,當(dāng)脈沖組件得到運(yùn)行權(quán)后,它將根據(jù)連接關(guān)系表查找與它相連的所有下級(jí)組件,依次檢查這些組件的輸入引腳的標(biāo)志位是否全為 0。若滿足條件,則它先通過 JavaBean的反射技術(shù)動(dòng)態(tài)獲得組件的功能方法,并調(diào)用該方法產(chǎn)生輸出信號(hào),然后,根據(jù)連接關(guān)系表依次把輸出值賦值給與它相連的下一級(jí)等待線程組件的輸入引腳上,再喚醒它們,之后自己重新進(jìn)入等待狀態(tài);否則,它將隨機(jī)等待一段時(shí)間,直到下次運(yùn)行權(quán)的獲得。下級(jí)等待線程被喚醒后便進(jìn)入可執(zhí)行狀態(tài),并可以再次競(jìng)爭(zhēng)CPU從而獲得運(yùn)行權(quán)。下級(jí)線程組件擁有運(yùn)行權(quán)后,進(jìn)行與脈沖組件相同的上述動(dòng)作。通過這種數(shù)據(jù)觸發(fā)機(jī)制建立起各個(gè)獨(dú)立組件之間的因果關(guān)聯(lián),從而使它們形成一個(gè)能夠協(xié)調(diào)工作的有機(jī)整體。
由于 SML匯編語言源程序只是符號(hào)化的機(jī)器語言程序,無法直接在CPU_Simulator上運(yùn)行,因此,在ASMLL中設(shè)計(jì)了SML匯編器,由其完成匯編語言源程序到目標(biāo)程序的轉(zhuǎn)換任務(wù)。該匯編器利用面向?qū)ο笤O(shè)計(jì)思想,進(jìn)行模塊化設(shè)計(jì),并采用遞歸分析法與工廠模式分別實(shí)現(xiàn)了語法分析和代碼生成模塊。
匯編器采用模塊化設(shè)計(jì),包含主控模塊、詞法分析、語法分析、目標(biāo)代碼生成、錯(cuò)誤處理、表格管理等多個(gè)模塊。其中,詞法分析器模塊對(duì)源程序進(jìn)行詞法規(guī)則檢查、構(gòu)造Token流。語法分析模塊則對(duì)Token流進(jìn)行語法規(guī)則檢查,生成語法樹并構(gòu)造符號(hào)表。最后,代碼生成模塊對(duì)符合語法規(guī)則的每行匯編語句進(jìn)行目標(biāo)代碼生成。在整個(gè)匯編過程中,表格管理模塊負(fù)責(zé)提供符號(hào)表、指令表的查找、修改功能,而錯(cuò)誤處理模塊則負(fù)責(zé)管理詞法、語法分析過程中檢測(cè)出的錯(cuò)誤信息。主控模塊負(fù)責(zé)組織全盤的工作流程,其具體過程為:首先將內(nèi)部變量LC初始化為0,然后從上向下一次一行地掃描程序,并進(jìn)行詞法和語法分析。每次移到下一行,就將LC加上當(dāng)前指令長(zhǎng)度。因此,LC總是等于當(dāng)前行的地址。如果在某行的開始發(fā)現(xiàn)標(biāo)號(hào),就將該標(biāo)號(hào)和LC中的當(dāng)前值輸入到符號(hào)表中。在第1遍掃描結(jié)束時(shí),匯編器已經(jīng)建立符號(hào)表與對(duì)應(yīng)指令的語法樹。匯編器然后執(zhí)行第2遍掃描,使用指令表和符號(hào)表中的信息匯編每條匯編指令。主控模塊的工作流程如圖3所示。
圖3 主控模塊的工作流程Fig.3 Work flow of main_control model
在匯編器的結(jié)構(gòu)中,語法分析和代碼生成模塊是匯編功能的核心模塊。語法分析和目標(biāo)代碼生成過程中反復(fù)用到包括 Token、語法樹、指令表等多種數(shù)據(jù)結(jié)構(gòu),因此,用于實(shí)現(xiàn)語法分析和匯編機(jī)器字的算法是匯編器設(shè)計(jì)的重點(diǎn)。
遞歸分析法對(duì)Token流進(jìn)行語法分析的思路是:將語法中每一個(gè)非終結(jié)符U的語法規(guī)則看作是識(shí)別U的一個(gè)過程定義,為其構(gòu)造子程序,以完成該非終結(jié)符所對(duì)應(yīng)的語法成分的分析和識(shí)別。若U的文法規(guī)則的右部只有1個(gè)候選式,則按從左向右的順序依次構(gòu)造非終結(jié)符的識(shí)別過程代碼;若有終結(jié)符號(hào),則判斷能否與輸入的符號(hào)匹配:若相等,則表示識(shí)別成功,移動(dòng)讀入指針指向下一個(gè)輸入符號(hào);若不等,則意味著輸入串此時(shí)有語法錯(cuò)誤;若是非終結(jié)符,則簡(jiǎn)單調(diào)用該非終結(jié)符的子程序,由這個(gè)子程序完成該非終結(jié)符所對(duì)應(yīng)的語法成分的分析和識(shí)別任務(wù)。只有被調(diào)用的分析和識(shí)別某語法成分的子程序匹配輸入串成功,且正確返回時(shí),該語法成分才算真正獲得識(shí)別。在本系統(tǒng)中,匯編器為每條匯編指令構(gòu)造了語法規(guī)則方法,用來識(shí)別該指令中的操作碼和操作數(shù)。每當(dāng)識(shí)別出 1個(gè)語法成分,就向語法樹中增加1個(gè)節(jié)點(diǎn),使得該語句的語法樹向下生長(zhǎng),直至語句中所有語法成分識(shí)別完畢、生成1棵完整的語法樹為止。若語句中出現(xiàn)語法錯(cuò)誤,則將相應(yīng)的信息交由錯(cuò)誤處理模塊管理。
目標(biāo)代碼生成模塊是由Assembler組件完成的。通過對(duì)語法樹中語法成分的查找,Assembler將找到的操作碼和操作數(shù)按一定的指令格式匯編成機(jī)器字,并將結(jié)果返回給調(diào)用者。由于 SML匯編語言涉及到變長(zhǎng)指令和多種尋址模式,不同指令的匯編模式是不同的。如所有轉(zhuǎn)移指令的指令長(zhǎng)度均為雙字節(jié),它們由尋址模式、操作碼、目的寄存器以及位移量4個(gè)字段組成;而算術(shù)邏輯指令的指令長(zhǎng)度則為單字節(jié),它們由操作碼、源寄存器以及目的寄存器3個(gè)字段組成,因此,需要為不同類型的指令實(shí)現(xiàn)各自的匯編功能。Assembler采用工廠模式統(tǒng)一匯編操作接口,為不同類型的匯編操作構(gòu)建實(shí)現(xiàn)模塊,交由匯編操作工廠管理。當(dāng)對(duì)語法成分進(jìn)行匯編時(shí),先由匯編操作工廠來實(shí)例化相應(yīng)的匯編操作對(duì)象,然后,調(diào)用具體的匯編方法來完成匯編任務(wù)。這樣,若需要支持新的指令格式,則只需將新的匯編操作實(shí)現(xiàn)后加入?yún)R編操作工廠即可,從而使得匯編器具有良好的可擴(kuò)充性。
源程序匯編成功后,匯編器將生成的目標(biāo)文件保存在本地,而此時(shí)CPU_Simulator中內(nèi)存組件的初始值為0。由于內(nèi)存組件采用二維整型數(shù)組模擬256字節(jié)的存儲(chǔ)空間,以此來存放目標(biāo)程序(默認(rèn)低地址存放代碼,高地址存放數(shù)據(jù),兩段以停機(jī)指令HALT為邊界),所以,程序的加載即為對(duì)該數(shù)組進(jìn)行讀寫操作。為方便目標(biāo)程序到內(nèi)存的加載,編譯加載模塊將程序匯編功能與加載功能進(jìn)行了集成。具體過程為:當(dāng)目標(biāo)程序保存本地后,匯編器繼續(xù)對(duì)該目標(biāo)文件讀操作,并把讀取到的數(shù)據(jù)傳入內(nèi)存組件的數(shù)組讀寫接口,由該接口完成數(shù)組中數(shù)據(jù)的寫操作,實(shí)現(xiàn)目標(biāo)程序到內(nèi)存組件的加載。
微指令流面板、存儲(chǔ)器面板以及寄存器面板構(gòu)成了整個(gè)調(diào)試界面,其上各種GUI組件的數(shù)據(jù)顯示由控制接口模塊負(fù)責(zé)控制。作為界面與CPU_Simulator之間的橋梁,控制接口模塊可被芯片組件直接調(diào)用。當(dāng)芯片組件因新數(shù)據(jù)到來觸發(fā)時(shí),控制接口馬上被該組件調(diào)用并接收到新數(shù)據(jù),從而使控制接口模塊能實(shí)時(shí)地得到CPU仿真器內(nèi)部數(shù)據(jù)的流動(dòng)及處理信息。在獲得數(shù)據(jù)后,控制接口模塊先判斷該數(shù)據(jù)的來源,再做相應(yīng)處理:若該數(shù)據(jù)來自寄存器組件,則將數(shù)據(jù)直接顯示在寄存器面板相應(yīng)的寄存器顯示欄上;若該數(shù)據(jù)來自內(nèi)存組件,則在存儲(chǔ)器面板中找到對(duì)應(yīng)指令行或數(shù)據(jù)行,然后將其高亮顯示;若該數(shù)據(jù)來自微控制存儲(chǔ)器,則根據(jù)微地址查找調(diào)試模塊中內(nèi)置的微代碼表,在獲得微指令、微操作說明以及后繼微地址后,將上述信息顯示在微指令流面板中。
在程序調(diào)試運(yùn)行時(shí),運(yùn)行面板上 CPU_Simulator芯片組件的狀態(tài)將同步更新,其更新效果由芯片組件的繪畫接口完成。繪畫接口被調(diào)用時(shí),1個(gè)標(biāo)注芯片名稱的矩形將畫在運(yùn)行面板上,同時(shí)該矩形上擁有相應(yīng)數(shù)目的引腳,其引腳值以不同顏色區(qū)分(黑色表示低電平,紅色代表高電平)。而微控制存儲(chǔ)芯片則比較特別,其繪畫接口被調(diào)用時(shí),除了顯示芯片的輸入輸出引腳值以外,還將在芯片的左側(cè)顯示當(dāng)前微指令的地址。在CPU_Simulator被加載時(shí),繪畫接口在運(yùn)行面板上繪畫出各個(gè)芯片的初始狀態(tài)及芯片間連接關(guān)系。在程序調(diào)試運(yùn)行、芯片組件因數(shù)據(jù)到來被激活時(shí),繪畫接口將對(duì)該芯片進(jìn)行重畫,以顯示芯片引腳的當(dāng)前輸入輸出值。若該芯片是微控制存儲(chǔ)芯片,則在芯片上還將顯示出當(dāng)前微指令的微地址。這樣,CPU_Simulator內(nèi)部芯片狀態(tài)以圖形化的方式在運(yùn)行面板上實(shí)時(shí)顯示,大大增加了系統(tǒng)的可視化效果和可理解性。
單步微調(diào)是本調(diào)試接口設(shè)計(jì)中的一個(gè)特點(diǎn)。由于微程序存儲(chǔ)器組件的調(diào)度由時(shí)鐘電路組件的脈沖信號(hào)觸發(fā),若能控制時(shí)鐘電路組件產(chǎn)生脈沖的節(jié)拍,即可實(shí)現(xiàn)微指令的單步調(diào)試。本文設(shè)計(jì)了單脈沖組件PulseSignal,由單脈沖組件PulseSignal發(fā)出的脈沖來觸發(fā)時(shí)鐘電路,進(jìn)而觸發(fā)一次微程序存儲(chǔ)器。其中,單脈沖組件PlusSignal信號(hào)的由用戶按鈕事件負(fù)責(zé)響應(yīng)。系統(tǒng)的整個(gè)調(diào)試過程為:CPU_Simulator啟動(dòng)時(shí),從內(nèi)存組件地址00處取出第1條指令,交由微程序控制器組件準(zhǔn)備譯碼執(zhí)行,用戶通過點(diǎn)擊按鈕觸發(fā)脈沖組件,發(fā)出信號(hào)觸發(fā)微控制器讀取1條微指令,并將其反饋到界面顯示該微指令及對(duì)應(yīng)的微操作說明,繼而取第2條,以此反復(fù),直到執(zhí)行停機(jī)指令HALT為止。
ASMLL為匯編語言初學(xué)者提供了全真的編程環(huán)境、強(qiáng)大的調(diào)試功能和多種虛擬器件的可視化視圖。通過這個(gè)平臺(tái),學(xué)習(xí)者能很好地進(jìn)行匯編語言編程訓(xùn)練,快速掌握常用指令功能以及指令在機(jī)器中的執(zhí)行流程,體會(huì)匯編語言控制硬件的本質(zhì)作用。
用戶首先通過瀏覽器下載嵌有該平臺(tái)的Applet頁面,可獲得匯編學(xué)習(xí)平臺(tái)所需的class文件,運(yùn)行后系統(tǒng)將進(jìn)入客戶端主界面。主界面主要分為兩部分:上部為工具欄,為用戶提供編程和CPU_Simulator加載功能;中間為 CPU_Simulator運(yùn)行面板,用來顯示CPU_Simulator可視化結(jié)構(gòu)。當(dāng)用戶點(diǎn)擊加載按鈕時(shí),CPU_Simulator將被加載到運(yùn)行面板,同時(shí),系統(tǒng)進(jìn)入初始狀態(tài)。用戶可繼續(xù)點(diǎn)擊工具欄上的編程按鈕,進(jìn)入?yún)R編語言編程窗口,在該窗口中編寫源程序。當(dāng)程序編寫完成后,則可以點(diǎn)擊窗口工具欄中的編譯加載按鈕,利用系統(tǒng)內(nèi)置的 SML匯編器匯編對(duì)當(dāng)前程序進(jìn)行匯編,并將生成的目標(biāo)程序加載到CPU_Simulator的內(nèi)存中。
此時(shí),CPU_Simulator被啟動(dòng),系統(tǒng)進(jìn)入目標(biāo)程序的調(diào)試運(yùn)行狀態(tài):當(dāng)用戶每點(diǎn)擊1次控制面板中的單步微指令按鈕,系統(tǒng)將單步執(zhí)行1條微指令,同時(shí)在左側(cè)的微指令流窗口顯示當(dāng)前微指令和對(duì)應(yīng)的微操作,右側(cè)的寄存器窗口則顯示各寄存器中的實(shí)時(shí)數(shù)據(jù)。當(dāng)用戶每點(diǎn)擊1次單步機(jī)器指令按鈕,系統(tǒng)將單步執(zhí)行1條機(jī)器指令,寄存器窗口中的程序計(jì)數(shù)器PC內(nèi)指針加 1,中間的存儲(chǔ)器窗口將以高亮顯示方式來表達(dá)當(dāng)前指令的跳變過程,左側(cè)的指令流窗口同時(shí)將顯示對(duì)應(yīng)的微程序流。用戶若需要連續(xù)運(yùn)行程序,則可點(diǎn)擊運(yùn)行按鈕。而按動(dòng)停止按鈕,則可以停止整個(gè)目標(biāo)程序的運(yùn)行。該功能只有在程序進(jìn)行單步機(jī)器指令和連續(xù)運(yùn)行時(shí)才有效,按動(dòng)該按鈕即可停止程序的運(yùn)行。
從實(shí)際應(yīng)用情況來看,ASMLL能為用戶提供機(jī)器指令取值、譯碼和執(zhí)行全過程的微指令級(jí)單步調(diào)試,并記錄相應(yīng)微指令流程,彌補(bǔ)了現(xiàn)有支撐平臺(tái)無法在微指令級(jí)對(duì)指令進(jìn)行跟蹤的不足。此外,ASMLL還提供了一個(gè)良好的視圖,將CPU及存儲(chǔ)器的內(nèi)容以具體的形式進(jìn)行展示,讓學(xué)習(xí)者對(duì)處理器結(jié)構(gòu)及程序、數(shù)據(jù)存放方式有更深的認(rèn)識(shí)。
(1) ASMLL采用 JavaBean組件技術(shù)實(shí)現(xiàn)了CPU_Simulator,結(jié)合多線程技術(shù)以及鎖的同步控制技術(shù),提出了一種組件數(shù)據(jù)觸發(fā)調(diào)度機(jī)制,有效解決了具有復(fù)雜關(guān)系組件之間的調(diào)度運(yùn)行問題,保證了微命令的有序執(zhí)行。
(2) ASMLL利用面向?qū)ο笤O(shè)計(jì)思想和匯編程序兩遍掃描機(jī)制,設(shè)計(jì)了基于CPU_Simulator的匯編器,實(shí)現(xiàn)了匯編語言源程序到CPU_Simulator上目標(biāo)程序的快速編譯。
(3) 該學(xué)習(xí)系統(tǒng)支持對(duì)程序進(jìn)行微指令級(jí)單步調(diào)試,并提供指令執(zhí)行時(shí)CPU_Simulator內(nèi)部寄存器數(shù)據(jù)變化的結(jié)構(gòu)視圖,使得學(xué)生能直觀地查看指令的執(zhí)行情況,有助于學(xué)生理解指令功能與程序執(zhí)行過程。
(4) ASMLL具有功能完整、交互性強(qiáng)、功能模塊化清晰的特點(diǎn),軟硬件視圖形象直觀,能為開發(fā)計(jì)算機(jī)相關(guān)課程學(xué)習(xí)平臺(tái)如微機(jī)原理組成原理等提供很好的參考模型。
[1] Goda B S, Gray D C, Loy J R. Teaching computer architecture in a pc equipped lab using turbo and sun assembly language[C]//Budny D. Proceedings of the Frontiers in Education Conference on 1995. Washington: IEEE Computer Society, 1995: 14?17.
[2] Shi Z M, Cox P T. EasyAssembly: A real visual assembly language[C]//Proceedings of Newfoundland Electrical and Computer Engineering Conference (NECEC 2001). St. John’s,Canada: IEEE, 2001: 31?37.
[3] Martin J J. Integrated software support for a course on computer organization and assembly language[C]//Cook G E.SoutheastCon 1999 Proceedings of IEEE. Nashville: IEEE, 1999:134?137.
[4] Agarwal K K, Agarwal A. Do we need a separate assembly language programming course[J]. Journal of Computing Sciences in Colleges, 2004, 19(4): 246?251.
[5] Imamura K. Assembly language is more than a teaching tool[J].Journal of Computing Sciences in Colleges, 2004, 20(1): 49?54.
[6] Buckner K. A non-traditonal approach to an assembly language course[J]. Journal of Computing Sciences in Colleges, 2006,22(1): 179?186.
[7] Quintana F, Herrera L. Tutor68: Educational software for the learning of the mc68000 assembly language[C]//Budny D.Proceedings of the Frontiers in Education Conference.Washington: IEEE Computer Society, 1995: 5?9.
[8] Yip K K R, Li K C D. A web-based call system on computer architecture and assembly language programming[C]//Kinshuk.Proceedings of the International Conference on Computers in Education. Auckland, New Zealand: IEEE Computer Society,2002: 1313?1314.
[9] Cecile Y, Matzi E, Miky R. Learning computer organization and assembly language with the easy CPU visual environment[C]//Demetrios G S. Proceedings of the 3rd IEEE International Conference on Advanced Learning Technologies. Athens: IEEE,2003: 491?491.
[10] Barnett B L. A visual simulator for a simple machine and assembly language[C]//Proceedings of the Twenty-sixth SIGCSE Technical Symposium on Computer Science Education. New York: ACM, 1995: 233?237.
[11] Ramirez J M, Navarro A, Gallardo V, et al. A graphical simulation tool for teaching microprocessors architecture and assembly language[C]//Budny D. Proceedings of the Frontiers in Education Conference on 1997. Chicago: IEEE Computer Society, 1997: 701?701.
[12] Kenneth V, Pete S. Mars: An education-oriented mips assembly language simulator[C]//Proceedings of the 37th SIGCSE Technical Symposium on Computer Science Education. New York: ACM, 2006: 239?243.
[13] 楊曉暉, 田俊. 基于 Web的匯編語言實(shí)驗(yàn)仿真[J]. 計(jì)算機(jī)應(yīng)用與軟件, 2005, 22(10): 133?134.
YAN Xiao-Hui, TIAN Jun. Web-based experimentation simulation of assembling language[J]. Computer Application and Software, 2005, 22(10): 133?134.
[14] Andrew W. The development of a computer-aided learning tool for supporting the teaching of assembly language programming[C]//Bruce D S. Proceedings of the 29th Annual Hawaii International Conference on System Sciences. Hawaii:HICSS, 1996: 323?331.
[15] 邢文峰, 姚慶棟, 史姍, 等. 一種高速靈活的指令仿真器[J].計(jì)算機(jī)工程, 2004, 30(22): 74?76.
XING Wen-feng, YAO Qing-dong, SHI Shan, et al. A fast and flexible instruction set simulator[J]. Computer Engineering, 2004,30(22): 74?76.
[16] 嚴(yán)暉, 楊路明. 基于多線程的計(jì)算機(jī)硬件虛擬實(shí)驗(yàn)室的設(shè)計(jì)與實(shí)現(xiàn)[J]. 中南大學(xué)學(xué)報(bào): 自然科學(xué)版, 2004, 35(2): 290?294.
YAN Hui,YANG Lu-ming. Multithread-based design and implementation of computer hardware system virtual laboratory[J]. Journal of Central South University of Technology:Natural Science, 2004, 35(2): 290?294.
(編輯 趙俊)
Design and implementation of assembly language learning system based on CPU simulator
SHENG Yu, YU Jin, CHEN Song-qiao, WANG Jian-xin
(School of Information Science and Engineering, Central South University, Changsha 410083, China)
An assembly language learning system (ASMLL), which is based on the CPU simulator, was presented.ASMLL simulated CPU with the JavaBean component technology. By using multi-thread technology and lock mechanism, ASMLL realized a scheduling mechanism based on component data triggered, which is an effective solution to deal with the scheduling problems of these components with complex relationship between each other, and can ensure micro-orders to run in an orderly implementation. Pulse signal based event triggered mechanism can implement the single-step debugging of enables microinstruction. Based on the instruction system of CPU simulator, a kind of assembler with modern compiler technology was designed, which can translate assembly instructions to machine instructions quickly on the CPU Simulator. ASMLL can display the status of virtual register and other virtual chips in real-time,record the corresponding microinstruction flow to monitor the implementation process of compiler command on CPU simulator.
CPU simulator; assembly language; compiling technique; micro-instructions flow
TP391.9
A
1672?7207(2010)06?2224?07
2009?10?21;
2009?12?28
國家自然科學(xué)基金資助項(xiàng)目(60773111);湖南省科技計(jì)劃項(xiàng)目(2010FJ4052);長(zhǎng)江學(xué)者和創(chuàng)新團(tuán)隊(duì)發(fā)展計(jì)劃項(xiàng)目(IRT0661)
王建新(1969?),男,湖南邵東人,博士,教授,從事計(jì)算機(jī)網(wǎng)絡(luò)優(yōu)化算法、虛擬實(shí)驗(yàn)環(huán)境研究;電話:0731-88830212;E-mail:jxwang@mail.csu.edu.cn