專利名稱:軟件仿真方法和裝置的制作方法
技術領域:
本發(fā)明涉及CPU仿真領域,特別是涉及一種軟件仿真方法和軟件仿真裝置。
背景技術:
目前,單片機因其諸多特點,在各行各業(yè)中得到了廣泛的應用,單片機的開發(fā)也日益受到重視。由于單片機本身沒有自開發(fā)功能,因此必須借助于開發(fā)工具。近年來,隨著個人計算機系統的不斷普及,國內外推出了不少以計算機為基礎的單片機開發(fā)系統。其中,軟件仿真方法是一種新型的開發(fā)方法,此方法是在宿主機(如計算機上或工作站平臺)上,以其CPU(如x86)及其系統資源來模擬目標機(如單片機)的CPU,并執(zhí)行用戶的目標程序的指令,使得一種設備(目標機)上的軟件可以在完全不同的設備(宿主機)上運行,這樣可以實現某個設備而完全不采用那個設備的硬件,用其他硬件系統代替,然后再采用軟件仿真去實現。此方法需要配置軟件仿真裝置和一系列相關的服務程序。使用時,只要在宿主機上運行軟件仿真裝置,就可以對目標指令進行調試。對于那些只是用到單片機內部資源的設計來說,可以在軟件仿真裝置內完成仿真工作。
軟件仿真裝置可以集成在嵌入式系統的集成開發(fā)環(huán)境(IDE)中來仿真目標機中CPU的運行,軟件仿真裝置運行起來和實際的目標機一樣,但是增加了其它功能,例如能夠通過調試界面來觀察目標機CPU中的程序和數據,并控制目標機CPU的運行;還可以用作程序性能評估工具(Profiler),可以在仿真執(zhí)行的過程中取得許多真正硬體無法取得的信息,這樣可以幫助程序開發(fā)者分析目標程序執(zhí)行性能,如指令數/秒(軟件仿真裝置每秒執(zhí)行的指令數)和CPI(Cycle per Instruction,平均每條指令的時鐘周期數)。
目標程序的調試是通過設置斷點、使程序在指定的目標指令位置停止運行來實現的。在目標程序中止的時候,檢查存儲器和寄存器的內容,作為發(fā)現程序錯誤的線索。
現有技術的軟件仿真方法包括三種逐條指令解釋、靜態(tài)重編譯和動態(tài)編譯。
其中,所謂逐條指令解釋是指逐條對目標程序指令進行仿真操作。其具體流程與真正目標機CPU的動作流程相似,先取出一個Opcode(運算碼),然后譯碼,執(zhí)行這個Opcode指令的動作,然后再把結果寫回到目標地址或寄存器。所述方法的缺點在于執(zhí)行一個指令所需要的動作很多,并且每次執(zhí)行到同一指令時都需要同樣的過程而不能減少步驟,其仿真的速度較慢,一般只能達到宿主機速度的1/100,而且重復執(zhí)行的步驟越多,速度越慢。
所謂靜態(tài)重編譯可以克服逐條指令解釋速度較慢的缺陷,類似編譯器的動作,將目標指令作為輸入語言編譯成宿主機的指令。其具體流程是集中的將所有的目標指令一次編譯成宿主機指令并進行存儲,而到執(zhí)行的時候不再進行編譯的動作,只是執(zhí)行宿主機指令完成原來的目標指令的功能就行了。該方法雖然編譯時速度較慢,但是執(zhí)行的時候速度較快,而且只需要進行一次編譯。該方法的缺點是對于動態(tài)的數據改變缺少應對措施,因為被編譯的目標程序有可能設計成在執(zhí)行時動態(tài)的修改Opcode,來實現動態(tài)的程序執(zhí)行,而由于目標機指令已經被一次性編譯成宿主機指令,這樣如果被執(zhí)行的段落想要修改Opcode就會造成混亂,導致當目標機的指令(或數據)動態(tài)改變時執(zhí)行結果錯誤。另外,由于在翻譯和優(yōu)化過程中改變了原來的指令形式,使得作為調試用途的使用變得較不方便。因為指令的形態(tài)和指令間的關系已經徹底變化了,使得觀察單個指令的結果、單步執(zhí)行、斷點設置都會變得混亂而難以使用。
所謂動態(tài)編譯相對于靜態(tài)重編譯是一種折衷的方案,可以避免出錯的情形,在執(zhí)行期間動態(tài)的對目標指令進行重編譯,也被稱作Thread Code技術。該方法類似于靜態(tài)重編譯,但是在指令的執(zhí)行中,編譯一條執(zhí)行一條,而不是一次性的集中編譯,其缺點在于由于必須逐個對指令編譯,使得對指令間行為的優(yōu)化不能進行,從而降低優(yōu)化效率及編譯效率;并且由于編譯效率降低導致代碼量增大,一般緩存區(qū)只是緩存最近的代碼(包括物理地址和一些調試信息),運行時,先在緩存區(qū)中查找要執(zhí)行的指令的地址,如果有就轉去執(zhí)行,如果沒有就再次翻譯,因此該方法的命中損失較大,仿真速度提高有限;對于大型目標程序更容易造成執(zhí)行速度不平穩(wěn),因為小的循環(huán)執(zhí)行段落緩存區(qū)能夠容納,速度較快,而大的循環(huán)執(zhí)行段落將導致緩存溢出,造成一些指令需要頻繁的反復編譯,速度大幅下降。
一種現有技術的軟件仿真方法屬于改進的動態(tài)編譯方法,其將相鄰的一組目標指令一起編譯并存放在緩存區(qū)內,從而在一定程度上進行優(yōu)化,提高編譯效率。但是由于現有技術選擇相鄰的一組指令進行編譯,如果目標指令執(zhí)行的路徑經常變化,即含有跳轉條件的指令較多時會導致更大的命中損失,引起更頻繁的重新編譯。例如當目標程序的指令具有1-2-3-4-5-6和1-2-5-6兩種執(zhí)行順序(即執(zhí)行指令2可能發(fā)生跳轉)時,如果選擇相鄰的一組指令1-2-3-4進行編譯,而實際運行到指令2時發(fā)生跳轉,會導致對指令3和4的編譯并沒有采用,增加了編譯時間,浪費了緩存區(qū)容量,或者每次仿真運行時都需要重新編譯,效率下降;另外,由于在優(yōu)化過程中指令形式改變,而且集中編譯相鄰的一組指令時起始指令和終點指令沒有有效的控制機制,會導致和靜態(tài)重編譯類似的問題發(fā)生,即不利于設置斷點、對目標程序進行調試。
發(fā)明內容
由于現有技術軟件仿真方法在執(zhí)行路徑變化時的命中損失較大、仿真速度較低,本發(fā)明解決的技術問題在于提供一種可以進行路徑分析從而減少命中損失、提高仿真速度的軟件仿真方法。
在此基礎上,本發(fā)明解決的另一技術問題在于提供一種便于對目標程序進行調試的軟件仿真方法。
本發(fā)明還提供一種可以進行路徑分析從而減少命中損失、提高仿真速度的軟件仿真裝置。
為此,本發(fā)明解決技術問題的技術方案是提供一種軟件仿真方法,用于將目標機的目標指令轉化為宿主機的宿主指令并運行所述宿主指令,包括地址查找步驟,在岐點鏈表存儲區(qū)的岐點鏈表中查找包含當前目標指令的地址的岐點項,如果找到則進入宿主指令執(zhí)行步驟,如果沒找到則進入路徑轉換步驟;路徑轉換步驟,確定以所述當前目標指令為起始指令的執(zhí)行路徑、編譯該執(zhí)行路徑的目標指令并存放于宿主指令緩存區(qū)、以所述起始指令的地址為岐點在岐點鏈表中添加岐點項;宿主指令執(zhí)行步驟,從岐點鏈表的岐點項中獲取所述目標指令的地址對應的宿主指令緩存地址,并轉去宿主指令緩存區(qū)執(zhí)行宿主指令。
本發(fā)明進一步的改進在于還包括步驟確定需設置為岐點的目標指令的地址;在岐點鏈表中查找與所述目標指令的地址相鄰的岐點項;將所述目標指令的地址作為岐點插入岐點鏈表;將所述目標指令的地址對應的岐點項及其相鄰的岐點項的宿主指令緩存地址置為空。
本發(fā)明還提供一種軟件仿真裝置,用于將目標機的目標指令轉化為宿主機的宿主指令并運行所述宿主指令,包括用于存放宿主指令的宿主指令緩存區(qū),其特征在于,還包括岐點鏈表存儲區(qū),用于存放岐點鏈表的岐點項,所述岐點鏈表的岐點項包括岐點地址和宿主指令緩存地址;地址查找單元,用于在岐點鏈表中查找包含當前目標指令的地址的岐點項,如果找到則啟動宿主指令執(zhí)行單元,如果沒找到則啟動路徑轉換單元;路徑轉換單元,用于確定以所述當前目標指令為起始指令的執(zhí)行路徑、編譯該執(zhí)行路徑的目標指令并存放于宿主指令緩存區(qū)、以所述起始指令的地址為岐點在岐點鏈表中添加岐點項;宿主指令執(zhí)行單元,用于從岐點鏈表的岐點項中獲取所述目標指令的地址對應的宿主指令緩存地址,并轉去宿主指令緩存區(qū)執(zhí)行宿主指令。
相對于現有技術,本發(fā)明的有益效果是由于本發(fā)明進行路徑轉換時進行動態(tài)路徑分析,確定執(zhí)行路徑的終點,并基于執(zhí)行路徑進行指令變換,而不是像現有技術的動態(tài)重編譯方式只簡單的變換相鄰的一組指令,這樣可以在提高編譯效率的同時減少由于執(zhí)行路線變化產生的命中損失,進一步提高仿真速度;同時由于生成岐點鏈表,實現目標指令的地址和宿主指令緩存地址的映射,從而允許動態(tài)調整執(zhí)行路徑分割方式,改善斷點設定或是單步執(zhí)行時的調試能力,方便調試目標程序。
圖1是本發(fā)明軟件仿真裝置的框圖;圖2是本發(fā)明軟件仿真方法采用的岐點鏈表和宿主指令緩存區(qū)示意圖;圖3是本發(fā)明軟件仿真方法的流程圖;圖4是本發(fā)明軟件仿真方法的路徑轉換的流程圖;圖5至圖7是應用本發(fā)明軟件仿真方法的具體實例示意圖;圖8是本發(fā)明軟件仿真方法的岐點設置的流程圖;圖9是應用本發(fā)明軟件仿真方法設置岐點的具體實例示意圖。
具體實施例方式
請參閱圖1,本發(fā)明軟件仿真裝置100用于在宿主機上仿真目標機的運行,將目標機的目標程序的指令翻譯成宿主機的宿主指令并執(zhí)行所述宿主指令。所述軟件仿真裝置100包括地址查找單元110、路徑轉換單元120、指令執(zhí)行單元130、宿主指令緩存區(qū)140和岐點鏈表存儲區(qū)150。
請一并參閱圖1和圖2,所述宿主指令緩存區(qū)140用于存放宿主指令;所述岐點鏈表存儲區(qū)150用于存儲岐點鏈表20,所述岐點鏈表20包含若干岐點項21,各岐點項21均包含岐點地址211、宿主指令緩存地址212、上一岐點指針213和下一岐點指針214等數據;所述地址查找單元110用于在程序運行時查找岐點鏈表20,判斷當前目標指令的地址是否已存在于岐點鏈表20中;所述路徑轉換單元120用于將目標指令編譯成宿主指令并將其存儲于宿主指令緩存區(qū)140、同時根據需要更新岐點鏈表存儲區(qū)150中的數據;所述指令執(zhí)行單元130用于執(zhí)行宿主指令緩存區(qū)140中的宿主指令。
為了便于對目標程序的調試,本發(fā)明軟件仿真裝置100還包括岐點設置單元160,用于在岐點鏈表20中增加岐點項21。
本發(fā)明所述宿主機和目標機泛指一切具有數據處理能力的電子設備,宿主機包括但不限于各種個人計算機、小型計算機、數據處理工作站以及各種專用數據處理系統,目標機包括但不限于單片機、嵌入式控制系統等。
本發(fā)明中,所述岐點是指各執(zhí)行路徑的第一條目標指令,所述執(zhí)行路徑是指軟件仿真裝置100仿真的目標指令的地址序列。
請一并參閱圖1至圖3,本發(fā)明軟件仿真方法的主流程包括步驟S1至步驟S6。
步驟S1是根據當前執(zhí)行路徑的終點確定轉向的目標指令的地址,所述轉向的目標指令的地址根據當前執(zhí)行路徑的運行結果由宿主機的存儲器或寄存器中的數據動態(tài)決定。
如果所述軟件仿真裝置100剛開始工作,則當前的終點就是CPU的啟動向量,此時轉向的目標指令的地址就是啟動向量指向的地址,也就是軟件仿真裝置100仿真的第一個目標指令。
步驟S2是地址查找步驟,由地址查找單元110執(zhí)行,對岐點鏈表存儲區(qū)150中的岐點鏈表20進行查找,具體的做法是查找岐點鏈表存儲區(qū)150是否包含一個岐點項21。如果岐點鏈表存儲區(qū)150不是空的,則同時判斷轉向的目標指令的地址是否已經包含在岐點鏈表20的岐點項21中。如果沒有包含,也就是說所述轉向的目標指令沒有翻譯,那么繼續(xù)執(zhí)行步驟S3;如果已經包含,也就是說已經找到一個有效的岐點項21,即所述轉向的目標指令已經翻譯,那么跳到步驟S4。
如果當前的終點是CPU的啟動向量,則岐點鏈表存儲區(qū)150應該是空的,即并不存在有效的、已經轉換完成的岐點鏈表20中的岐點項21,此時執(zhí)行步驟S3。
步驟S3是路徑轉換步驟,由路徑轉換單元120對前述轉向的目標指令即當前目標指令與下一個岐點項之間的目標指令進行編譯,同時更新岐點鏈表存儲區(qū)150中的數據,將所述當前目標指令的地址作為岐點項21添加入岐點鏈表20。
在路徑變換步驟S3中,也可以限定執(zhí)行路徑長度,將一個較長的路徑拆分成多個較短路徑。
步驟S4到步驟S6是宿主指令執(zhí)行步驟,由指令執(zhí)行單元130進行。首先是步驟S4,從岐點鏈表20中的岐點項21中獲得宿主指令緩存地址212的數據;其次,實施步驟S5,轉到宿主指令緩存區(qū)150的執(zhí)行對應的宿主指令;然后當執(zhí)行到所述執(zhí)行路徑的終點時,跳到步驟S1繼續(xù)處理。
請一并參閱圖1、圖2和圖4,是本發(fā)明軟件仿真方法中路徑轉換的流程圖,包括步驟S31至步驟S37。
步驟S31是確認所述需轉換的執(zhí)行路徑的終點。具體是沿著要轉向的目標指令的方向在岐點鏈表20中尋找最近的岐點項21,如果找到,則以該岐點項21為所述執(zhí)行路徑的終點;如果找不到,則證明沒有合適的岐點項。
步驟S32至步驟S35是編譯目標指令的循環(huán)操作。首先是步驟S32,將目標指令分解成多個微操作碼;步驟S33是將微操作碼重組為宿主指令;步驟S34中,將宿主指令寫入宿主指令緩存區(qū)140。
完成一條目標指令的分解后,即可獲悉當前的目標指令是否含有跳轉動作,如果不含有,則繼續(xù)下一步操作;如果含有,則直接跳到步驟S36,準備完成路徑轉換。
下一步操作是判斷是否已到達步驟S31中查找到的終點。如果已經到達,則跳到步驟S36,準備完成路徑轉換;如果沒有到達,則繼續(xù)步驟S35。如果步驟S31中沒有找到終點,則不進行這一步操作,直接執(zhí)行步驟S35。
步驟S35是獲取下一條目標指令,并轉到步驟S32,進行循環(huán)操作,直到路徑轉換完成。
當然,重組微操作碼成宿主指令的步驟S33和寫入宿主指令緩存區(qū)140的步驟S34也可以在步驟S35之后進行,即在循環(huán)操作后集中完成目標指令的編譯。
步驟S36和步驟S37是更新岐點鏈表存儲區(qū)150中的數據。首先實施步驟S36,將當前岐點項21插入岐點鏈表20,在其中寫入岐點地址211、對應的上一岐點指針213和下一岐點指針214,如果沒有與其相鄰的岐點,則設置上一岐點指針213和/或下一岐點指針214為空。然后實施步驟S37,在岐點項21中寫入該執(zhí)行路徑對應的宿主指令的宿主指令緩存地址214。
請一并參閱圖5至圖6,為了便于理解本發(fā)明,下面結合具體實例進行描述。
所述軟件仿真裝置100動態(tài)編譯目標程序300的指令301-313(其中包含三條含跳轉動作的目標指令303,309和311),將宿主指令存放在宿主指令緩存區(qū)140,同時在岐點鏈表存儲區(qū)150生成岐點鏈表20。運行軟件仿真裝置100,啟動向量將指向某一條目標指令,開始進入本發(fā)明軟件仿真方法的流程。
若啟動向量指向地址為301的第一條目標指令,則步驟S1確定的當前目標指令的地址為301;地址查找單元實施步驟S2,查找岐點鏈表存儲區(qū)150,由于此時岐點鏈表存儲區(qū)150沒有岐點鏈表,因此進入步驟S3,開始轉換岐點為第一條目標指令的執(zhí)行路徑。
步驟S3是轉換路徑子流程。首先執(zhí)行步驟S31,確認所述需轉換的執(zhí)行路徑的終點。具體是沿著第一目標指令的方向在岐點鏈表20中尋找最近的岐點項21,由于此時沒有合適的岐點項,直接進入循環(huán)操作,直到路徑轉換完成。
執(zhí)行步驟S32至步驟S34,將第一條目標指令分解為多個微操作碼,重組微操作碼成宿主指令,將宿主指令寫入宿主指令緩存區(qū)140,存放地址可以隨機確定,本實例中宿主指令緩存地址設為142。
由于當前指令不含跳轉動作,并且找不到最近的岐點,因此進入步驟S35,轉到下一條目標指令,繼續(xù)處理。
當處理到地址為303的目標指令時,由于該目標指令含有跳轉動作,因此在翻譯該目標指令后,實施步驟S36和步驟S37,中止編譯,更新岐點鏈表20,寫入第一個岐點項21,其岐點地址211的數據為301,上一岐點指針212和下一岐點指針213均設置為空,宿主指令緩存地址212的數據為142。
然后回到主流程,實施步驟S4至步驟S6,由指令執(zhí)行單元130進行宿主指令的運行。首先是步驟S4,從岐點鏈表20中的岐點項21中獲得宿主指令緩存地址212的數據為142;其次,實施步驟S5,轉到宿主指令緩存區(qū)150的對應的緩存地址142執(zhí)行所述指令;然后當執(zhí)行到所述執(zhí)行路徑的終點時,根據執(zhí)行路徑的運算結果,跳到步驟S1,確定轉向的目標指令。
設該執(zhí)行路徑此次運算的結果將導致跳轉到地址為307的目標指令,實施步驟S2,由于此時岐點鏈表20中不含有地址307,因此轉換以該目標指令為岐點的執(zhí)行路徑,直到完成對含有跳轉動作的地址為309的目標指令的翻譯,同時將目標指令的地址307作為岐點,更新岐點鏈表20,其岐點地址211的數據為307,上一岐點指針212和下一岐點指針213分別設置為301和空,宿主指令緩存地址212的數據為144。
隨后轉換以310為第一條目標指令的執(zhí)行路徑,直到完成對含有跳轉動作的指令311的翻譯,將目標指令的地址310作為岐點,更新岐點鏈表20。
隨后轉換以312為第一條目標指令的執(zhí)行路徑,由于313是目標程序的地址最大的一條指令,將導致回到地址為301的目標指令。
請參閱圖7,由于此時目標指令的地址301已包含于岐點鏈表20的岐點項21中,因此直接執(zhí)行步驟S4至S5,設該執(zhí)行路徑此次運算的結果將不會導致跳轉到地址為307的目標指令,則步驟S1確定的轉向的目標指令的地址為304。
實施步驟S2,由于此時岐點鏈表20中不含有地址304,因此轉換以該目標指令的地址為岐點的執(zhí)行路徑,直到來到最近的下一個岐點307,完成路徑轉換,將目標指令的地址304作為岐點,更新岐點鏈表20。
請參閱圖8,是本發(fā)明軟件仿真方法設置岐點的流程圖,設置岐點通過在岐點鏈表20中增加岐點項來實現。
請一并參閱圖9,在確定要設置岐點的目標地址后,例如需要在目標地址305處設置岐點,首先執(zhí)行步驟D1,在岐點鏈表20中查找得到與該新的岐點項相鄰的上一岐點304和下一岐點307。
做為保護性的措施,如果沒有找到與新的岐點項相鄰的上一岐點和下一岐點之一,則此時這個新岐點將是第一個或者是最后一個岐點,其插入的位置就是岐點鏈表20的頭或尾。
隨后實施步驟D2,在上一岐點304和下一岐點307之間,插入該新的岐點項,上一岐點304的下一岐點指針214的數據修改為305,新岐點302的下一岐點指針214的數據設置為307。
然后實施步驟D3,將這個新岐點305以及上下相鄰岐點304、307的宿主指令緩存地址212均設置為空,這樣就相當于執(zhí)行路徑沒有轉換過。當下次執(zhí)行到這里時,就會重新轉換執(zhí)行路徑。這也是一個強制刷新的動作,因為上次轉換完成的可能是對應于原來的起點和終點的,而現在要把原來的一個執(zhí)行路徑拆成兩段,所以就把岐點項21的宿主指令緩存地址212添成空的,強制重新轉換這一段。
所述設置岐點的步驟可以將需設置為岐點的目標指令的地址作為岐點插入岐點鏈表20,從而允許動態(tài)調整執(zhí)行路徑分割方式,改善目標指令的斷點設置或是單步執(zhí)行時的調試能力,方便調試目標程序。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應當指出,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明原理的前提下,還可以作出若干改進和潤飾,這些改進和潤飾也應視為本發(fā)明的保護范圍。
權利要求
1.一種軟件仿真方法,用于將目標機的目標指令轉化為宿主機的宿主指令并運行所述宿主指令,包括地址查找步驟,在岐點鏈表存儲區(qū)的岐點鏈表中查找包含當前目標指令的地址的岐點項,如果找到則進入宿主指令執(zhí)行步驟,如果沒找到則進入路徑轉換步驟;路徑轉換步驟,確定以所述當前目標指令為起始指令的執(zhí)行路徑、編譯該執(zhí)行路徑的目標指令并存放于宿主指令緩存區(qū)、以所述起始指令的地址為岐點在岐點鏈表中添加岐點項;宿主指令執(zhí)行步驟,從岐點鏈表的岐點項中獲取所述目標指令的地址對應的宿主指令緩存地址,并轉去宿主指令緩存區(qū)執(zhí)行宿主指令。
2.根據權利要求1所述的軟件仿真方法,其特征在于所述路徑轉換步驟包括在岐點鏈表中查找沿當前目標指令的地址方向最近的岐點項;分解當前目標指令成微操作碼,判斷是否含有跳轉動作,如果含有跳轉動作則以當前目標指令的地址為所述執(zhí)行路徑的終點;如果不含有跳轉動作則判斷是否到達最近的岐點,如果到達則以當前目標指令的地址為所述執(zhí)行路徑的終點;如果沒有到達最近的岐點,則繼續(xù)分解下一條目標指令,直到到達所述執(zhí)行路徑的終點。
3.根據權利要求2所述的軟件仿真方法,其特征在于所述路徑轉換步驟包括將微操作碼逐條重組為宿主指令或者將執(zhí)行路徑的所有目標指令的微操作碼集中重組為宿主指令。
4.根據權利要求2所述的軟件仿真方法,其特征在于所述路徑轉換步驟還包括限定執(zhí)行路徑的長度,當執(zhí)行路徑達到預定長度時,以當前目標指令的地址為所述執(zhí)行路徑的終點。
5.根據權利要求1至權利要求4任一項所述的軟件仿真方法,其特征在于,還包括步驟確定需設置為岐點的目標指令的地址;在岐點鏈表中查找與所述目標指令的地址相鄰的岐點項;將所述目標指令的地址作為岐點插入岐點鏈表;將所述目標指令的地址對應的岐點項及其相鄰的岐點項的宿主指令緩存地址置為空。
6.根據權利要求5所述的軟件仿真方法,其特征在于在岐點鏈表中查找與所述目標指令的地址相鄰的岐點項時,如果沒有找到與所述地址上、下相鄰的岐點項之一,則將對應于所述地址的岐點項插入岐點鏈表的頭或尾。
7.一種軟件仿真裝置,用于將目標機的目標指令轉化為宿主機的宿主指令并運行所述宿主指令,包括用于存放宿主指令的宿主指令緩存區(qū),其特征在于,還包括岐點鏈表存儲區(qū),用于存放岐點鏈表的岐點項,所述岐點鏈表的岐點項包括岐點地址和宿主指令緩存地址;地址查找單元,用于在岐點鏈表中查找包含當前目標指令的地址的岐點項,如果找到則啟動宿主指令執(zhí)行單元,如果沒找到則啟動路徑轉換單元;路徑轉換單元,用于確定以所述當前目標指令為起始指令的執(zhí)行路徑、編譯該執(zhí)行路徑的目標指令并存放于宿主指令緩存區(qū)、以所述起始指令的地址為岐點在岐點鏈表中添加岐點項;宿主指令執(zhí)行單元,用于從岐點鏈表的岐點項中獲取所述目標指令的地址對應的宿主指令緩存地址,并轉去宿主指令緩存區(qū)執(zhí)行宿主指令。
8.根據權利要求7所述的軟件仿真裝置,其特征在于還包括岐點設置單元,用于將需設置為岐點的目標指令的地址作為岐點插入岐點鏈表。
9.根據權利要求7或8所述的軟件仿真裝置,其特征在于所述岐點鏈表的岐點項還包括與該岐點上、下相鄰的岐點指針。
全文摘要
本發(fā)明公開了一種軟件仿真方法,用于將目標機的目標指令轉化為宿主機的宿主指令并運行所述宿主指令,包括地址查找步驟,在岐點鏈表存儲區(qū)的岐點鏈表中查找包含當前目標指令的地址的岐點項,如果找到則進入宿主指令執(zhí)行步驟,如果沒找到則進入路徑轉換步驟;路徑轉換步驟,確定以所述當前目標指令為起始指令的執(zhí)行路徑、編譯該執(zhí)行路徑的目標指令并存放于宿主指令緩存區(qū)、以所述起始指令為岐點在岐點鏈表中添加岐點項;宿主指令執(zhí)行步驟,從岐點鏈表的岐點項中獲取所述目標指令的地址對應的宿主指令緩存地址,并轉去宿主指令緩存區(qū)執(zhí)行宿主指令。本發(fā)明減少由于執(zhí)行路線變化產生的命中損失,提高了仿真速度;同時方便調試目標程序。
文檔編號G06F9/455GK1635474SQ200310124219
公開日2005年7月6日 申請日期2003年12月31日 優(yōu)先權日2003年12月31日
發(fā)明者張巖 申請人:北京北陽電子技術有限公司