SI02匯編語言集成開發(fā)環(huán)境介紹
匯編語言作為可以直接對計算機硬件進行操作的語言,無論語言和架構(gòu)如何發(fā)展,其最高的執(zhí)行效率和最直接的硬件操作都是不可替代的,這也是為什么絕大多數(shù)語言中都可以內(nèi)嵌匯編語言的原因。而在實際工作中,能使用匯編語言熟練編寫程序的工作人員卻相當匱乏,究其原因,除了匯編語言比較抽象,難于掌握以外,一個主要的原因就是匯編語言的上機環(huán)境普遍使用的是基于命令行的編譯、鏈接程序,沒有集成開發(fā)環(huán)境,造成程序在編制和調(diào)試上的困難。
基于上述原因及實際工作需要,我們開發(fā)一個專用于SI02匯編語言的集成開發(fā)環(huán)境,以改善程序開發(fā)環(huán)境、提高編程效率。
2.SI02匯編語言簡介
SI02是自行研制的一種16位的微處理器芯片,該芯片有自己的指令系統(tǒng)和匯編語言—SI02。SI02匯編語言不支持數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型,但是在語法、格式和結(jié)構(gòu)等方面和C語言幾乎完全一致,從而使用戶更加易于掌握。SI02編程語言不區(qū)分大小寫,但建議用戶用小寫字母編寫程序,以便提高編譯效率;SI02編程語言支持十進制和十六進制兩種數(shù)據(jù)表示方法,其中十六進制的數(shù)據(jù)應(yīng)以“0x”作為數(shù)據(jù)的開頭。在使用該匯編語言編程時,要求遵循圖1所示的程序結(jié)構(gòu)。
以上各結(jié)構(gòu)之中,除主程序之外都不是必要部分,但如若用到,則必須按照圖中所示順序出現(xiàn)。另外,程序結(jié)構(gòu)中的數(shù)據(jù)塊是指在一些應(yīng)用問題中,需使用一些固定數(shù)據(jù),如變換表格等,這些數(shù)據(jù)在SI02編程語言中以數(shù)據(jù)塊的形式出現(xiàn),數(shù)據(jù)塊部分一般出現(xiàn)在程序的末尾,格式如下:
標號: 數(shù)據(jù)1;[注釋]
………………
數(shù)據(jù)n;[注釋]
此數(shù)據(jù)塊的標號應(yīng)作為系統(tǒng)常量定義。需要操作該數(shù)據(jù)塊時,將標號賦給某個通用地址寄存器RA,然后按照存儲器尋址方式操作就可以了。
3. 功能設(shè)計
通過詳細分析,確定該集成開發(fā)環(huán)境的功能。
3.1 SI02IDE功能分析
用戶針對SI02語言的程序進行編輯、編譯和調(diào)試等相應(yīng)操作,需要一種相應(yīng)的集成開發(fā)工具,并且能在功能設(shè)置、使用方法和界面設(shè)計等方面盡量與主流集成開發(fā)環(huán)境相同或相似,從而便于用戶使用,在這種要求下開發(fā)的SI02IDE主要具有以下五部分內(nèi)容:菜單欄、工具欄、程序編輯窗口、工作環(huán)境窗口和信息輸出窗口。其中工作環(huán)境窗口和信息輸出窗口通過屬性頁或標簽頁結(jié)構(gòu)可以同時顯示多項內(nèi)容。
1) 菜單:用戶的文件、編輯、搜索、窗口等命令都可以通過菜單條上的命令發(fā)出。
2) 工具條窗口:用戶的文件、編輯、搜索、窗口等命令都可以通過工具條窗口上的圖形快捷按鈕發(fā)出。
3) 工作環(huán)境窗口:可以顯示系統(tǒng)目錄、正在編輯的文件,文件中的函數(shù)以樹形目錄顯示出來。可以通過雙擊打開文件,可以通過此窗口中的快捷菜單快速獲得函數(shù)的位置。
4) 信息輸出窗口:顯示編譯過程中各個階段的狀態(tài)和編譯進度,以免編譯時間較長時用戶誤會死機,還要顯示編譯時發(fā)現(xiàn)的錯誤名稱及其類型和位置。顯示查找結(jié)果,標明查找內(nèi)容所在文件和行號,可以通過雙擊名稱而使程序編輯窗口顯示相應(yīng)的內(nèi)容。
5)文本編輯窗口:文本編輯窗口顯示程序源文件,對SI02語言中的語法關(guān)鍵字進行高亮顯示,并可以直接修改程序,而在調(diào)試過程中,這里將顯示程序執(zhí)行到的地點以及斷點等信息。另外,目標文件、臨時文件和頭文件等也可以在這里顯示。用戶可以很方便的選擇正在編輯的文件,并可以切換到全屏狀態(tài)編輯。
另外,用戶要在脫離SI02處理器的情況下,在PC機實現(xiàn)對SI02匯編程序的執(zhí)行,那么需要使用軟件的手段來實現(xiàn)該過程。在此情形下,開發(fā)軟件仿真器也是很必要的,仿真(Emulator)就是在PC機中用軟件模擬微處理器CPU的特性,實現(xiàn)對算術(shù)邏輯單元(ALU)和指令系統(tǒng)的仿真,使得由匯編程序產(chǎn)生的目標代碼可以在匯編語言集成開發(fā)環(huán)境中運行,并具有調(diào)試功能。其必要性主要有以下因素:
1)要脫離真實的硬件,在可視化程度較高的界面下執(zhí)行匯編程序,必須有仿真器模擬真實處理器的各項功能;
2)用戶的匯編程序在執(zhí)行過程中可能會用到某些存儲空間,該仿真器能夠使用軟件手段為用戶提供該空間;
3)在模擬執(zhí)行用戶程序時,用戶需要設(shè)置斷點、單步執(zhí)行、連續(xù)執(zhí)行、進入子程序和越過子程序等各種執(zhí)行方式,仿真器應(yīng)能對用戶輸入的調(diào)試命令進行識別并執(zhí)行相應(yīng)命令;
4)執(zhí)行用戶命令后,能對該命令的執(zhí)行結(jié)果進行判斷,并能根據(jù)判斷結(jié)果修改相應(yīng)的寄存器或存儲器的內(nèi)容;
5)該仿真器執(zhí)行程序過程中應(yīng)能保存源程序的相關(guān)信息,以方便通過界面反饋給用戶。
3.2 SI02IDE功能設(shè)計
從以上對該集成開發(fā)環(huán)境的需求分析可以看出,該系統(tǒng)可以分為SI02語言編輯器、匯編和模擬執(zhí)行三大功能模塊。
1)SI02語言編輯器:它的主要功能是為程序員提供一個開發(fā)SI02源程序的界面。該界面上包括三個主要窗口:
(1)程序編輯窗口:主要用來編輯源程序,具有打開、關(guān)閉、復制、粘貼以及實現(xiàn)關(guān)鍵字變色等功能;而在程序調(diào)試過程中,這里將顯示程序執(zhí)行到的地點以及設(shè)置的斷點等信息,程序單步執(zhí)行時還跟蹤顯示程序執(zhí)行的過程。另外,目標文件、臨時文件和頭文件等也可以在這里顯示。
(2)工作環(huán)境窗口:該窗口以樹型結(jié)構(gòu)的形式來顯示當前用戶工程中所使用的函數(shù)文件,雙擊該某個結(jié)點時程序編輯窗口中會自動顯示該結(jié)點上的文件或函數(shù)。
(3)信息輸出窗口:主要用來顯示編譯信息和查找信息。
2)匯編程序:該模塊的主要功能是把源程序匯編成目標代碼文件。這里的源程序是SI02匯編語言程序,目標代碼是SI02處理器的機器語言代碼。
3)模擬執(zhí)行程序:它的主要功能是模擬SI02處理器執(zhí)行SI02機器語言文件。該模塊和編輯器相結(jié)合,為用戶提供設(shè)置斷點單步執(zhí)行、連續(xù)執(zhí)行、執(zhí)行到斷點等各種程序調(diào)試手段,極大的提高了程序的開發(fā)效率。
根據(jù)以上對系統(tǒng)功能的劃分以及各個模塊的功能,可以得出系統(tǒng)的詳細設(shè)計圖如圖3所示:程程序編輯器和模擬執(zhí)行功能模塊細分如圖4所示。通過點擊菜單條上的調(diào)試菜單項中除編譯外的二級菜單,可以激發(fā)軟件仿真類中相應(yīng)的成員函數(shù),實現(xiàn)調(diào)試的功能。既可以采用連續(xù)執(zhí)行、跟蹤(StepInto細分圖單步運行且進入子程序)和步越(StepOver單步運行但不進入子程序)方式進行調(diào)試,也可以設(shè)置斷點并使程序運行至斷點處或運行至光標處進行調(diào)試。調(diào)試中可以打開特殊功能寄存器窗口、代碼窗口(顯示程序存儲器的內(nèi)容)和變量窗口,觀察指令運行對特殊功能寄存器的影響,并可通過變量窗口查看變量的值
3.3 SI02IDE接口說明
1)List文件:列表文件List.lst提供源文件與目標文件中各行指令的對應(yīng)關(guān)系,其一行格式為:
[SL:源文件行號][TL:目標文件行號]源程序內(nèi)容
其中若源程序行沒有與之相對應(yīng)的目標程序行存在(比如注釋),則與此源程序行對應(yīng)的目標程序行號表示為[xxxxx]。
2)Obj文件:目標文件Obj.obj存儲將源程序匯編生成的中間代碼,其格式為三元式,描述一行如下:
L:行號,操作符,操作數(shù)1,操作數(shù)2;
其中,若兩個操作數(shù)之一或全部不存在,則相應(yīng)位置表示為xxxxx。
3)錯誤信息文件:錯誤信息文件用來存儲程序匯編期間和模擬執(zhí)行時發(fā)現(xiàn)的錯誤信息,包括錯誤類型、錯誤位置等;它有匯編和模擬執(zhí)行程序?qū)懭?,由編輯模塊讀出。
4)數(shù)據(jù)信息文件:用來存儲程序執(zhí)行結(jié)束后,存儲器和寄存器里的數(shù)據(jù)信息。它由模擬執(zhí)行程序?qū)懭?,當用戶需要這些信息時,由編輯器模塊負責讀出顯示到界面相應(yīng)的位置。
4.SI02IDE的實現(xiàn)
根據(jù)上節(jié)設(shè)計的系統(tǒng)功能可知,系統(tǒng)分別需要從以下三個方面實現(xiàn)。
4.1匯編程序的實現(xiàn)
匯編程序是將匯編語言轉(zhuǎn)換為機器代碼的軟件,該過程的源語言是SI02匯編語言,目標語言是面向SI02芯片的機器代碼。利用C++語言中類的封裝性,將匯編程序作為整個軟件中的一個類來處理。以確保數(shù)據(jù)成員的有效性,有效防止編程錯誤。該類的功能是將匯編源程序逐行讀入,并進行判斷、計算、分析,最后給出正確的機器碼。
這需要對匯編源程序進行兩次掃描,第一次掃描主要是對程序中所出現(xiàn)的變量以及標號建立檔案,檔案用于存放變量和標號的地址。第二次掃描主要是對整個源程序進行正確的譯碼,若源程序有錯,給出所有出錯信息,以便于檢查和修改;源程序若無錯誤則生成可執(zhí)行的目標代碼。
匯編程序類中分別用三個數(shù)組保存了每條指令的行號、程序計數(shù)器地址、和字節(jié)數(shù),以便在軟件仿真類中使用。匯編結(jié)束要生成error.txt,list.txt和obj.txt三個配置文件,他們存放有關(guān)源匯編語言程序的相關(guān)信息,以便在調(diào)試模塊中使用。
4.2 模擬執(zhí)行程序(仿真程序)的實現(xiàn)
模擬執(zhí)行程序(仿真程序)由C++語言編寫的軟件仿真的類來實現(xiàn)。該類被說明為匯編程序類的友員,以便訪問匯編程序類的數(shù)據(jù)成員。
類中構(gòu)造了一結(jié)構(gòu)型變量來實現(xiàn)對硬件方面的仿真,并用一個成員函數(shù)來模擬指令執(zhí)行的流程。該函數(shù)的參數(shù)是當前正運行的指令的PC值,返回將要運行的下條指令的PC值。
通過對匯編程序類中產(chǎn)生的每條指令所在的行號、程序計數(shù)器(PC)的地址、指令的機器碼和字節(jié)數(shù)的分析,確定該指令是否改變了特殊功能寄存器、片內(nèi)RAM、片外RAM以及程序計數(shù)器(PC) 的值。并根據(jù)分析的結(jié)果更新特殊功能寄存器和RAM的值。若該指令是跳轉(zhuǎn)指令,需根據(jù)跳轉(zhuǎn)條件判斷跳轉(zhuǎn)的地址,獲得跳轉(zhuǎn)到的行的PC值,作為函數(shù)的返回值。否則將源程序的PC值增加1。
當然,該開發(fā)環(huán)境還支持單步執(zhí)行、執(zhí)行到斷點等程序調(diào)試方式,它們在實現(xiàn)方法上和連續(xù)執(zhí)行基本一致,只是單步執(zhí)行時每次只執(zhí)行一條語句,然后等待用戶輸入新的命令才開始執(zhí)行下條程序;執(zhí)行到斷點的實現(xiàn),只需在連續(xù)執(zhí)行流程中增加一個是否執(zhí)行到斷點了的判斷語句:如果不是斷點,則程序往下執(zhí)行;如果是斷點則停止執(zhí)行,等待用戶輸入新的命令。而新命令的輸入,則是通過編輯器界面上的調(diào)試菜單或鍵盤操作來實現(xiàn)。
4.3 編輯器(集成開發(fā)環(huán)境界面)的實現(xiàn)
界面設(shè)計的目的是為了提供良好的人機交互環(huán)境,集編輯、匯編、調(diào)試和通信于一體,便于使用。利用MFC的消息映像機制,通過鼠標和鍵盤事件來驅(qū)動相應(yīng)程序的運行。面向程序設(shè)計語言的符號化調(diào)試技術(shù)的特點就是能夠支持在源程序的任何程序語句上設(shè)置斷點,并支持單步執(zhí)行、連續(xù)執(zhí)行、執(zhí)行到斷點等多種程序執(zhí)行方式。
上述所有功能都要以交互的方式來完成,并且以調(diào)試時顯示合適的源代碼的行號的形式來達到這些目的。面向程序設(shè)計語言的符號調(diào)試,可以面向多種程序設(shè)計語言,我們做的這個開發(fā)環(huán)境主要面向SI02匯編語言的程序設(shè)計,因此我們所要開發(fā)的調(diào)試環(huán)境就是為這個使用匯編語言編寫的程序提供調(diào)試服務(wù)。
面向程序設(shè)計語言的符號化調(diào)試技術(shù)的實現(xiàn)需要從編譯或匯編連接系統(tǒng)中取得幫助,也就是說,編譯或匯編連接系統(tǒng)在進行嵌入式軟件的編譯(匯編)生成時,要盡可能多的保留程序源代碼的信息,即在所產(chǎn)生的目標代碼文件中保存目標代碼與源代碼之間聯(lián)系的信息。包括從源代碼到目標代碼的對應(yīng)關(guān)系的信息、程序調(diào)試過程中出現(xiàn)的錯誤信息、以及源代碼中所用到的符號的定義的信息。調(diào)試環(huán)境通過對目標文件結(jié)構(gòu)進行分析,從已存在的信息中建立以下幾種聯(lián)系的運行時調(diào)試信息表,從而為實現(xiàn)面向程序設(shè)計語言的符號化調(diào)試提供了基礎(chǔ)。
(1)目標地址到源代碼的對應(yīng)關(guān)系表;
(2)系統(tǒng)常量與內(nèi)存地址的對應(yīng)關(guān)系表;
(3)系統(tǒng)變量與內(nèi)存地址的對應(yīng)關(guān)系表;
(4)運行代碼的標號與目標地址的對應(yīng)關(guān)系表;
(5)匯編或運行過程中出現(xiàn)的錯誤信息表
其中,目標地址到源代碼的對應(yīng)關(guān)系可以由匯編以后生成的List文件和Obj文件來表示;系統(tǒng)常量與內(nèi)存地址的對應(yīng)關(guān)系表可由系統(tǒng)常量表中所保存的地址信息來建立;系統(tǒng)變量與內(nèi)存地址的對應(yīng)關(guān)系可由系統(tǒng)變量表中的信息來建立。另外匯編或運行過程中如果出現(xiàn)錯誤,調(diào)試器應(yīng)能夠到錯誤信息文件中進行查找并顯示相應(yīng)的錯誤信息。
建立這些聯(lián)系表,并不是在運行時直接提供調(diào)試所需要的信息,從這一角度來看,應(yīng)用程序調(diào)試環(huán)境必須對下列現(xiàn)象進行處理:
(1)程序運行的當前行顯示;
(2)變量跟蹤與變量內(nèi)容顯示;
(3)斷點行顯示;
(4)變量檢查及修改;
(5)錯誤信息顯示。
為解析上述現(xiàn)象,調(diào)試環(huán)境需要即時的取得模擬執(zhí)行模塊的執(zhí)行狀態(tài),并取得各種寄存器的值、內(nèi)存狀態(tài)以及模擬執(zhí)行的方式,再通過對各種聯(lián)系表的處理來實現(xiàn)面向程序設(shè)計語言的調(diào)試。開發(fā)完成后的系統(tǒng)如圖5所示。
5.結(jié)論
SI02IDE作為面向SI02語言的集成開發(fā)環(huán)境,將方便用戶使用SI02語言進行各種開發(fā)工作。本文的創(chuàng)新點在于提高了軟件開發(fā)的速度、效率和質(zhì)量,使該軟件成為軟件開發(fā)最重要的和必不可少的開發(fā)工具。但該開發(fā)環(huán)境在功能上仍有一些缺陷和不夠理想的地方。比如,對斷點位置的處理不如主流IDE方便和直觀,仍需進一步的改進和提高。