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