本發(fā)明涉及一種指令集模擬器驗(yàn)證方法,尤其涉及一種在嵌入式體系結(jié)構(gòu)的指令集模擬器中使用的驗(yàn)證方法。
背景技術(shù):
指令集模擬器是用來(lái)在一種體系結(jié)構(gòu)上模擬另一種體系結(jié)構(gòu)的軟件。它通過(guò)仿真每條指令在目標(biāo)處理器上的執(zhí)行效果來(lái)模擬目標(biāo)機(jī)。隨著嵌入式系統(tǒng)軟件的發(fā)展,以及嵌入式應(yīng)用在各個(gè)行業(yè)的普及,嵌入式軟件開(kāi)發(fā)已經(jīng)被越來(lái)越多的人所關(guān)注,然而嵌入式軟件在真實(shí)硬件上進(jìn)行開(kāi)發(fā)非常困難,同時(shí)成本也很高。因此,嵌入式系統(tǒng)的模擬器便變得非常的重要,使用模擬器能夠模擬真實(shí)的硬件環(huán)境,同時(shí)又能降低成本,提高開(kāi)發(fā)效率。所以指令集模擬器的正確性至關(guān)重要。然而指令集模擬器的驗(yàn)證工作非常繁瑣,需要覆蓋幾乎全部的模擬指令,并比對(duì)處理器的狀態(tài),目前采用的方法是運(yùn)行一個(gè)測(cè)試用例逐步驗(yàn)證每條指令之后的處理器狀態(tài)和指令執(zhí)行結(jié)果,難以全面覆蓋模擬器的指令集,同時(shí)驗(yàn)證工作相當(dāng)繁瑣,降低了開(kāi)發(fā)效率。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種基于源代碼插樁的指令集模擬器驗(yàn)證方法。
本發(fā)明的目的是通過(guò)以下技術(shù)方案來(lái)實(shí)現(xiàn)的:一種基于源代碼插樁的指集模擬器驗(yàn)證方法,該方法包括以下步驟:
(1)在模擬器中對(duì)輸出到特定內(nèi)存區(qū)域的結(jié)果重定向至文件中。
(2)在測(cè)試用例中增加將結(jié)果輸出到特定內(nèi)存區(qū)域的代碼。
(3)手動(dòng)提供預(yù)期的結(jié)果正確的輸出文件。
(4)將測(cè)試名稱(chēng)、測(cè)試用例程序、預(yù)期輸出文件地址寫(xiě)入配置文件中,如果有多個(gè)測(cè)試用例可以返回步驟(2)繼續(xù)增加測(cè)試用例。
(5)編寫(xiě)腳本使計(jì)算機(jī)自動(dòng)進(jìn)行模擬器輸出文件和預(yù)期輸出文件的比對(duì)。
進(jìn)一步地,所述步驟(1)具體為:模擬器打開(kāi)新的輸出文件,將對(duì)特定內(nèi)存區(qū)域的寫(xiě)數(shù)據(jù)保存在文件中。
進(jìn)一步地,所述步驟(2)具體為:在測(cè)試用例的關(guān)鍵區(qū)域,將關(guān)鍵值或者結(jié)果輸出到預(yù)先定義好的特定內(nèi)存區(qū)域,對(duì)此內(nèi)存區(qū)域的寫(xiě)訪(fǎng)問(wèn)在模擬器中將視為輸出。
進(jìn)一步地,所述步驟(5)具體為:編寫(xiě)python腳本,讀取配置文件,逐個(gè)模擬運(yùn)行其中測(cè)試用例程序,將模擬器輸出文件和預(yù)期輸出文件進(jìn)行比對(duì),若一致則測(cè)試通過(guò),繼續(xù)下一個(gè)測(cè)試用例,若所有測(cè)試用例均通過(guò),則模擬器通過(guò)驗(yàn)證。
本發(fā)明的有益效果是:本發(fā)明將特定內(nèi)存區(qū)域用于輸出,在測(cè)試用例中增加輸出關(guān)鍵數(shù)據(jù)的代碼,并提供預(yù)期輸出,并通過(guò)腳本使計(jì)算機(jī)能夠自動(dòng)完成比對(duì),并可進(jìn)行批量的測(cè)試用例的測(cè)試,大大簡(jiǎn)化了模擬器的驗(yàn)證任務(wù),為模擬器的驗(yàn)證提供了一種新的方法。該方法也可用于其他類(lèi)型軟件的測(cè)試工作,能夠極大地縮減開(kāi)發(fā)周期,提高開(kāi)發(fā)效率,具有良好的應(yīng)用前景。
附圖說(shuō)明
圖1是本發(fā)明方法流程圖。
具體實(shí)施方式
本發(fā)明基于源代碼插樁的指令集模擬器驗(yàn)證方法,包括如下步驟:
(1)在模擬器中對(duì)輸出到特定內(nèi)存區(qū)域的結(jié)果重定向至文件中。
模擬器打開(kāi)新的輸出文件,將對(duì)特定內(nèi)存區(qū)域的寫(xiě)數(shù)據(jù)保存在文件中。
(2)在測(cè)試用例中增加將結(jié)果輸出到特定內(nèi)存區(qū)域的代碼。
在測(cè)試用例的關(guān)鍵區(qū)域,將關(guān)鍵值或者結(jié)果輸出到預(yù)先定義好的特定內(nèi)存區(qū)域,對(duì)此內(nèi)存區(qū)域的寫(xiě)訪(fǎng)問(wèn)在模擬器中將視為輸出。
(3)手動(dòng)提供預(yù)期的結(jié)果正確的輸出文件。
(4)將測(cè)試名稱(chēng)、測(cè)試用例程序、預(yù)期輸出文件地址寫(xiě)入配置文件中,如果有多個(gè)測(cè)試用例可以返回步驟(2)繼續(xù)增加測(cè)試用例。
(5)編寫(xiě)腳本使計(jì)算機(jī)自動(dòng)進(jìn)行模擬器輸出文件和預(yù)期輸出文件的比對(duì)。
編寫(xiě)python腳本,讀取配置文件,逐個(gè)模擬運(yùn)行其中測(cè)試用例程序,將模擬器輸出文件和預(yù)期輸出文件進(jìn)行比對(duì),若一致則測(cè)試通過(guò),繼續(xù)下一個(gè)測(cè)試用例,若所有測(cè)試用例均通過(guò),則模擬器通過(guò)驗(yàn)證。
以下通過(guò)實(shí)施例對(duì)本發(fā)明做進(jìn)一步解釋。用該方法對(duì)指令集模擬器進(jìn)行測(cè)試。圖1是對(duì)指令集模擬器進(jìn)行驗(yàn)證的流程圖,第一步在模擬器中將某一區(qū)域內(nèi)存定義為特殊區(qū)域內(nèi)存,測(cè)試用例對(duì)這一區(qū)域的寫(xiě)數(shù)據(jù)保存在文件中。第二步在測(cè)試用例中的關(guān)鍵位置添加輸出關(guān)鍵數(shù)據(jù)的代碼。第三步,根據(jù)輸出的數(shù)據(jù)手動(dòng)提供預(yù)期輸出的數(shù)據(jù),保存在文件中。第四步,將測(cè)試用例程序路徑、測(cè)試名稱(chēng)、預(yù)期輸出文件路徑保存在配置文件中。若還有測(cè)試用例則返回第二步繼續(xù)添加;若無(wú)則編寫(xiě)腳本,讀取配置文件,逐個(gè)模擬運(yùn)行其中測(cè)試用例程序,將模擬器輸出文件和預(yù)期輸出文件進(jìn)行比對(duì),若一致則測(cè)試通過(guò),若所有測(cè)試用例均通過(guò),則模擬器通過(guò)驗(yàn)證。
以如下測(cè)試用例為例:
該測(cè)試用例計(jì)算了1+2的值,隨后將該結(jié)果輸出,myprintf函數(shù)的作用是向特定地址輸出數(shù)據(jù)。
模擬器處理內(nèi)存操作的函數(shù)如下:
函數(shù)內(nèi)模擬器將向特定地址的寫(xiě)數(shù)據(jù),重定向至文件中。
因?yàn)轭A(yù)期輸出是3,所以手動(dòng)提供的預(yù)期輸出文件的內(nèi)容是“3”。
配置文件的內(nèi)容如下:
其中,name表示測(cè)試的名稱(chēng),outputfile表示手動(dòng)提供的預(yù)期輸出文件,path表示測(cè)試用例。
腳本的代碼如下:
腳本執(zhí)行的是一個(gè)for循環(huán),循環(huán)配置文件的每個(gè)測(cè)試用例,2、3行分別讀取測(cè)試的名稱(chēng)、測(cè)試用例,4行輸出測(cè)試名稱(chēng),5行讀取預(yù)期輸出文件名,6行模擬器運(yùn)行測(cè)試用例,-o設(shè)置模擬器輸出文件為temp.txt,8、9行打開(kāi)模擬器的輸出文件和手動(dòng)提供的預(yù)期輸出文件,10行進(jìn)行比對(duì),如果一致則測(cè)試通過(guò),輸出“ok”,不一致則輸出“wrong”。