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