專利名稱:計(jì)算機(jī)程序除錯(cuò)系統(tǒng)及方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種計(jì)算機(jī)程序處理系統(tǒng)及方法,特別是關(guān)于一種計(jì)算機(jī)程序除錯(cuò)系統(tǒng)及方法。
背景技術(shù):
程序除錯(cuò)的目的是了解計(jì)算機(jī)程序執(zhí)行的過(guò)程,以便糾正計(jì)算機(jī)程序執(zhí)行過(guò)程中出現(xiàn)的 錯(cuò)誤。目前Intel中央處理器提供一種除錯(cuò)方法,該方法利用中央處理器內(nèi)部的最后分支追 蹤寄存器(Last Branch Trace MSR)記錄計(jì)算機(jī)程序執(zhí)行的過(guò)程。該最后分支追蹤寄存器 只適用于真實(shí)模式(real mode)、保護(hù)模式(protected mode)及虛擬86模式(V86 mode )。當(dāng)中央處理器在系統(tǒng)管理模式(System Management Mode, S麗)時(shí),就不能利用最后 分支追蹤寄存器進(jìn)行計(jì)算機(jī)程序的除錯(cuò)。
發(fā)明內(nèi)容
鑒于以上內(nèi)容,有必要提出一種系統(tǒng)管理模式下的計(jì)算機(jī)程序除錯(cuò)系統(tǒng)及方法。 一種計(jì)算機(jī)程序除錯(cuò)系統(tǒng),用于中央處理器工作在在系統(tǒng)管理模式下對(duì)原程序的執(zhí)行過(guò) 程進(jìn)行追蹤,該系統(tǒng)包括追蹤標(biāo)志設(shè)置模塊,用于將中央處理器的標(biāo)志寄存器的追蹤標(biāo)志 設(shè)置為"1";寄存器入棧模塊,用于在執(zhí)行完原程序的一條指令后將除錯(cuò)過(guò)程中需要使用 的寄存器的值壓入堆棧;操作碼讀取模塊,用于讀取原程序的下一條指令的操作碼并判斷該 下一條指令的類型;標(biāo)志出棧處理模塊,用于當(dāng)原程序的下一條指令是標(biāo)志出棧指令時(shí),將 該標(biāo)志出棧指令將要儲(chǔ)存的追蹤標(biāo)志設(shè)置為"1";轉(zhuǎn)移處理模塊,用于當(dāng)原程序的下一條 指令是控制轉(zhuǎn)移指令并滿足轉(zhuǎn)移條件時(shí),計(jì)算轉(zhuǎn)移的起始地址及目的地址,并儲(chǔ)存該起始地 址及目的地址;及寄存器出棧模塊,用于將壓入堆棧的寄存器的值彈出堆棧并返回原程序。
一種計(jì)算機(jī)程序除錯(cuò)方法,用于中央處理器工作在系統(tǒng)管理模式下對(duì)原程序的執(zhí)行過(guò)程 進(jìn)行追蹤,該方法包括步驟(a)將中央處理器的標(biāo)志寄存器的追蹤標(biāo)志設(shè)置為"1" ; (b) 在執(zhí)行完原程序的一條指令后將除錯(cuò)過(guò)程中需要使用的寄存器的值壓入堆棧;(c)讀取原程 序的下一條指令的操作碼并根據(jù)該操作碼判斷該下一條指令的類型;(d)若原程序的下一條 指令是標(biāo)志出棧指令,則將該標(biāo)志出棧指令要儲(chǔ)存的追蹤標(biāo)志設(shè)置為"1",轉(zhuǎn)到步驟(g); (e)若原程序的下一條指令是控制轉(zhuǎn)移指令且滿足轉(zhuǎn)移條件,則計(jì)算轉(zhuǎn)移的起始地址及目的 地址,否則直接轉(zhuǎn)到步驟(g); (f)儲(chǔ)存所述起始地址及目的地址;及(g)將壓入堆棧的寄存
5器的值彈出堆棧并返回原程序。
本發(fā)明涉及的計(jì)算機(jī)程序除錯(cuò)系統(tǒng)及方法,其利用第l號(hào)中斷及通過(guò)分支追蹤方法記錄程序的執(zhí)行過(guò)程,從而實(shí)現(xiàn)了在系統(tǒng)管理模式下的計(jì)算機(jī)程序除錯(cuò)。
圖l為本發(fā)明程序除錯(cuò)系統(tǒng)的運(yùn)行環(huán)境示意圖。
圖2為本發(fā)明程序除錯(cuò)系統(tǒng)的分支追蹤方法示意圖。
圖3為本發(fā)明程序除錯(cuò)系統(tǒng)較佳實(shí)施例的功能模塊圖。
圖4為本發(fā)明程序除錯(cuò)方法較佳實(shí)施例的流程圖。
圖5為堆棧中的標(biāo)志寄存器、中斷返回地址的示意圖。
圖6為堆棧中的調(diào)用返回地址、標(biāo)志寄存器及中斷返回地址的示意圖。
圖7為堆棧中的調(diào)用返回地址、標(biāo)志寄存器、中斷返回地址及其他寄存器的示意圖。
圖8為條件短轉(zhuǎn)移指令、條件近轉(zhuǎn)移指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址的示意圖。
圖9為無(wú)條件短轉(zhuǎn)移指令、無(wú)條件近轉(zhuǎn)移指令、無(wú)條件遠(yuǎn)轉(zhuǎn)移指令、近調(diào)用指令、遠(yuǎn)調(diào)用指令、近返回指令、遠(yuǎn)返回指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址的示意圖。
具體實(shí)施例方式
如圖1所示,是本發(fā)明計(jì)算機(jī)程序除錯(cuò)系統(tǒng)的運(yùn)行環(huán)境示意圖。該計(jì)算機(jī)程序除錯(cuò)系統(tǒng)ll運(yùn)行在計(jì)算機(jī)l上,當(dāng)計(jì)算機(jī)l中的中央處理器(CPU,在圖中未畫出)工作在系統(tǒng)管理模式下時(shí),計(jì)算機(jī)程序除錯(cuò)系統(tǒng)l 1對(duì)計(jì)算機(jī)1上運(yùn)行的原程序12的執(zhí)行過(guò)程進(jìn)行追蹤。CPU內(nèi)部有多個(gè)寄存器,如標(biāo)志寄存器(Flags)、代碼段寄存器(CS)、指令指針寄存器(IP)、計(jì)數(shù)寄存器(CX)(在圖中均未畫出)。
所述計(jì)算機(jī)程序除錯(cuò)系統(tǒng)ll利用第l號(hào)中斷(INT1)追蹤原程序12的執(zhí)行過(guò)程。當(dāng)CPU工作在系統(tǒng)管理模式下并設(shè)定Flags的追蹤標(biāo)志(Trace Flag, TF)為"1"時(shí),CPU按單步方式運(yùn)行原程序12,每執(zhí)行完一條指令就會(huì)產(chǎn)生INT1,并執(zhí)行INT1中斷處理程序,當(dāng)INT1中斷處理程序執(zhí)行結(jié)束后,再返回原程序12執(zhí)行下一條指令。在INT1中斷處理程序中記錄原程序12的執(zhí)行過(guò)程,即實(shí)現(xiàn)原程序12的除錯(cuò)。
控制轉(zhuǎn)移指令通過(guò)修改CS和IP的值,使原程序12的執(zhí)行順序發(fā)生轉(zhuǎn)移。當(dāng)CPU執(zhí)行控制轉(zhuǎn)移指令并且滿足轉(zhuǎn)移條件時(shí),程序的執(zhí)行順序?qū)l(fā)生轉(zhuǎn)移。分支追蹤方法通過(guò)記錄原程序12發(fā)生轉(zhuǎn)移之前的地址(以下簡(jiǎn)稱起始地址)與發(fā)生轉(zhuǎn)移之后的地址(以下簡(jiǎn)稱目的地址)來(lái)對(duì)原程序12進(jìn)行追蹤。采用分支追蹤方法能夠提高計(jì)算機(jī)程序除錯(cuò)的效率??刂妻D(zhuǎn)移指令將原程序12分割為許多小的區(qū)塊,起始地址為離開一個(gè)區(qū)塊的地址,目的地址為進(jìn)入下一個(gè)區(qū)塊的地址,根據(jù)所記錄的起始地址與目的地址可以推斷出原程序12完整的執(zhí)行過(guò)程。如圖2所示,假設(shè)原程序12從01000010h開始執(zhí)行,執(zhí)行到01000029h發(fā)生第一次轉(zhuǎn)移,轉(zhuǎn)移至01000050h,執(zhí)行到01000070h發(fā)生第二次轉(zhuǎn)移,轉(zhuǎn)移至01000082h,執(zhí)行至01000092h結(jié)束,則第一次轉(zhuǎn)移的起始地址是01000029h,目的地址是01000050h,第二次轉(zhuǎn)移的起始地址是01000070h,目的地址是01000082h。由兩次轉(zhuǎn)移的起始地址和目的地址,可知原程序12的執(zhí)行過(guò)程是01000010h 01000029h (即第一個(gè)區(qū)塊),01000050h 01000070h (即第二個(gè)區(qū)塊),01000082h 01000092h (即第三個(gè)區(qū)塊)。在本實(shí)施例中用h表示十六進(jìn)制數(shù),例如01000010h、 01000029h分別表示十六進(jìn)制數(shù)01000010、 01000029。
如圖3所示,是本發(fā)明計(jì)算機(jī)程序除錯(cuò)系統(tǒng)較佳實(shí)施例的功能模塊圖。所述計(jì)算機(jī)程序除錯(cuò)系統(tǒng)11包括追蹤標(biāo)志設(shè)置模塊110、寄存器入棧模塊lll、操作碼讀取模塊112、標(biāo)志出棧處理模塊113、轉(zhuǎn)移處理模塊114、輔助除錯(cuò)模塊115及寄存器出棧模塊116。
追蹤標(biāo)志設(shè)置模塊110用于將Flags的TF標(biāo)志設(shè)置為"1"。當(dāng)TF4時(shí),CPU按單步方式運(yùn)行原程序12,每執(zhí)行完一條指令就會(huì)產(chǎn)生INT1。
寄存器入棧模塊111用于在執(zhí)行完原程序12的一條指令進(jìn)入INT1中斷處理程序時(shí),將除錯(cuò)過(guò)程中需要使用的寄存器的值壓入堆棧。將寄存器的值壓入堆棧一方面是為了保護(hù)中斷現(xiàn)場(chǎng),使得在返回原程序l2時(shí)將寄存器恢復(fù)到INT1前的值,繼續(xù)執(zhí)行原程序l2的下一條指令;另一方面可以通過(guò)寄存器的值進(jìn)行輔助除錯(cuò),例如檢査計(jì)數(shù)寄存器CX的值是否正常。
操作碼讀取模塊112用于讀取下一條指令的操作碼并根據(jù)該操作碼判斷下一條指令的類型。通過(guò)指令的機(jī)器碼能夠判斷該指令的類型,如指令C3 (十六進(jìn)制)代表遠(yuǎn)返回指令。
標(biāo)志出棧處理模塊113用于當(dāng)下一條指令是標(biāo)志出棧指令(POPF)時(shí),將標(biāo)志出棧指令要儲(chǔ)存的TF標(biāo)志設(shè)置為"1"。
轉(zhuǎn)移處理模塊114用于當(dāng)下一條指令是控制轉(zhuǎn)移指令且滿足轉(zhuǎn)移條件時(shí),計(jì)算轉(zhuǎn)移的起始地址和目的地址。
輔助除錯(cuò)模塊l 15用于對(duì)原程序12進(jìn)行其他的除錯(cuò)檢測(cè),即除了追蹤原程序12的執(zhí)行過(guò)程,檢測(cè)其他的錯(cuò)誤,例如檢査計(jì)數(shù)寄存器CX的值是否不正常。
寄存器出棧模塊116用于將進(jìn)入INT1中斷處理程序時(shí)壓入堆棧的寄存器的值彈出堆棧并返回原程序12。
如圖4所示,是本發(fā)明程序除錯(cuò)方法較佳實(shí)施例的流程圖。
7步驟S400,追蹤標(biāo)志設(shè)置模塊110將Flags的TF標(biāo)志設(shè)置為"1"。具體方法是把Flags壓入堆棧,將棧頂元素與0100h取或(OR)后彈回Flags,使得TF二1。
步驟S401,寄存器入棧模塊111在執(zhí)行完原程序12的一條指令后,將需要使用的寄存器的值壓入堆棧。執(zhí)行完原程序12的一條指令后產(chǎn)生INT1, CPU將Flags、 CS及IP的值壓入堆棧,然后清除TF、 IF,以保證執(zhí)行中斷處理程序時(shí)不會(huì)響應(yīng)外部中斷,并且也不會(huì)響應(yīng)INT1。CS及IP分別是下一條指令的段地址及偏移地址,即中斷返回的段地址及中斷返回的偏移地址,將壓入堆棧的中斷返回的段地址用INT—CS表示,將壓入堆棧的中斷返回的偏移地址用INT—IP表示,將壓入堆棧的Flags的值用INT—FLAGS表示,堆棧中的Flags、中斷返回地址如圖5所示。當(dāng)執(zhí)行調(diào)用指令(包括近調(diào)用指令Call Near與遠(yuǎn)調(diào)用指令Call Far)時(shí),CPU會(huì)將調(diào)用指令的下一條指令的地址(稱為調(diào)用返回地址)壓入堆棧,以便執(zhí)行返回指令(包括近返回指令Ret Near與遠(yuǎn)返回指令Ret Far)時(shí)可返回到原程序12中調(diào)用指令的下一條指令繼續(xù)執(zhí)行。若是近調(diào)用(段內(nèi)調(diào)用),調(diào)用返回地址包括調(diào)用返回的偏移地址(用CALL—IP表示),若是遠(yuǎn)調(diào)用(段間調(diào)用),調(diào)用返回地址包括調(diào)用返回的段地址(用CALL—Far—CS表示)及調(diào)用返回的偏移地址(CALL—IP)。堆棧中的調(diào)用返回地址、Flags及中斷返回地址如圖6所示(圖中以遠(yuǎn)調(diào)用為例)。進(jìn)入INT1中斷處理程序時(shí)若需要使用其他的寄存器,如需要利用其他的寄存器進(jìn)行輔助除錯(cuò),將其他需要使用的寄存器的值壓入堆棧,如將計(jì)數(shù)寄存器(CX)、數(shù)據(jù)段寄存器(DS)、堆棧指針寄存器(SP)、基指針寄存器(BP)、堆棧段寄存器(SS)的值壓入堆棧,堆棧中的調(diào)用返回地址、Flags、中斷返回地址及其他寄存器如圖7所示。
步驟S402,操作碼讀取模塊l 12讀取下一條指令的操作碼。讀取下一條指令的操作碼所在內(nèi)存地址的內(nèi)容,即得到下一條指令的操作碼。如將下一條指令的段地址(CS)傳送給數(shù)據(jù)段寄存器(DS),將下一條指令的偏移地址(IP)傳送給變址寄存器(SI),貝IJDS:SI所指向的內(nèi)存地址的內(nèi)容即為下一條指令的操作碼。
步驟S403,操作碼讀取模塊112根據(jù)下一條指令的操作碼判斷該下一條指令的類型。指令分為標(biāo)志出棧指令(POPF)、控制轉(zhuǎn)移指令等類型,若下一條指令不是POPF,也不是控制轉(zhuǎn)移指令,而是其他類型的指令,則轉(zhuǎn)到步驟S408。
步驟S404,若下一條指令是POPF,則標(biāo)志出棧處理模塊113將該P(yáng)0PF要儲(chǔ)存的TF標(biāo)志設(shè)置為"1",轉(zhuǎn)到步驟S408。 POPF指令會(huì)影響Flags的值,為了保證能夠繼續(xù)利用INT1進(jìn)行程序除錯(cuò),當(dāng)下一條指令為POPF時(shí),將該指令將要儲(chǔ)存的Flags中的TF標(biāo)志設(shè)置為l,以保護(hù)TF標(biāo)志的值。
8步驟S405,若下一條指令是控制轉(zhuǎn)移指令,并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移處理模塊114根據(jù)該控制轉(zhuǎn)移指令計(jì)算轉(zhuǎn)移的起始地址和目的地址。需要說(shuō)明的是,若下一條指令是控制轉(zhuǎn)移指令,然而不滿足轉(zhuǎn)移條件,則轉(zhuǎn)到步驟S408 (在圖4中未畫出)??刂妻D(zhuǎn)移指令通過(guò)改變CS:IP來(lái)控制程序的執(zhí)行順序。本實(shí)施例需要處理的控制轉(zhuǎn)移指令包括條件短轉(zhuǎn)移指令、無(wú)條件短轉(zhuǎn)移指令、條件近轉(zhuǎn)移指令、無(wú)條件近轉(zhuǎn)移指令、無(wú)條件遠(yuǎn)轉(zhuǎn)移指令、近調(diào)用指令、遠(yuǎn)調(diào)用指令、近返回指令及遠(yuǎn)返回指令。若需要處理其他的控制轉(zhuǎn)移指令,可以參照上述控制轉(zhuǎn)移指令的處理方法。假設(shè)步驟S401中壓入堆棧的中斷返回地址是INT—CS及INT—IP,近調(diào)用的調(diào)用返回地址是CALL—IP,該近調(diào)用的調(diào)用返回地址是近返回所對(duì)應(yīng)的調(diào)用返回地址,遠(yuǎn)調(diào)用的調(diào)用返回地址是CALL—Far—CS及CALL—IP,該遠(yuǎn)調(diào)用的調(diào)用返回地址是遠(yuǎn)返回所對(duì)應(yīng)的調(diào)用返回地址,本步驟S405包括如下情況
若下一條指令是條件短轉(zhuǎn)移指令(/f。" Short)并且滿足轉(zhuǎn)移條件,則條件短轉(zhuǎn)移的起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rel8+2) &FFh),其中10h、 FFh表示十六進(jìn)制數(shù)lO、 FF。條件短轉(zhuǎn)移指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖8所示。條件短轉(zhuǎn)移指令的機(jī)器碼為7x/E3 rel8,其中7x/E3是操作碼,7x表示70/71/72/……/7F; rel8是操作數(shù),表示條件短轉(zhuǎn)移指令的下一條指令地址與目的地址之間的8位地址位移量。由于條件短轉(zhuǎn)移指令的長(zhǎng)度是2個(gè)字節(jié),因此該條件短轉(zhuǎn)移指令到目的指令的地址位移量為(rel8+2),為保證(rel8+2)在O(TFFh范圍內(nèi),取條件短轉(zhuǎn)移指令到目的指令的地址位移量為(rel8+2) &FFh。例如對(duì)于條件短轉(zhuǎn)移指令75FA,起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (FA+2) &FFh)
若下一條指令是無(wú)條件短轉(zhuǎn)移指令(JMP Short)并且滿足轉(zhuǎn)移條件,則無(wú)條件短轉(zhuǎn)移的起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rel8+2) &FFh)。無(wú)條件短轉(zhuǎn)移指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。無(wú)條件短轉(zhuǎn)移指令的機(jī)器碼為EB rel8,其中EB是操作碼,rel8是操作數(shù),表示無(wú)條件短轉(zhuǎn)移指令的下一條指令地址與目的地址之間的8位地址位移量。
若下一條指令是條件近轉(zhuǎn)移指令(/f^ Near)并且滿足轉(zhuǎn)移條件,則條件近轉(zhuǎn)移的起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rell6+4) &FFFFh)。條件近轉(zhuǎn)移指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖8所示。條件近轉(zhuǎn)移指令的機(jī)器碼為0F8x rel16,其中0F8x是操作碼,rell6是操作數(shù),表示條件近轉(zhuǎn)移指令的下一條指令地址與目的地址之間的16位地址位移量。由于條件近轉(zhuǎn)移指令
9的長(zhǎng)度是4個(gè)字節(jié),因此該條件近轉(zhuǎn)移指令到目的指令的地址位移量為(rell6+4),為保證(rell6+4)在000(TFFFFh范圍內(nèi),取條件近轉(zhuǎn)移指令到目的指令的地址位移量為(rell6+4) feFFFFh。
若下一條指令是無(wú)條件近轉(zhuǎn)移指令(JMP Near)并且滿足轉(zhuǎn)移條件,則無(wú)條件近轉(zhuǎn)移的起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rell6+3) &FFFFh)。無(wú)條件近轉(zhuǎn)移指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。無(wú)條件近轉(zhuǎn)移指令的機(jī)器碼為E9 rel16,其中E9是操作碼,rell6是操作數(shù),表示無(wú)條件近轉(zhuǎn)移指令的下一條指令地址與目的地址之間的16位地址位移量。
若下一條指令是無(wú)條件遠(yuǎn)轉(zhuǎn)移指令(JMP Far)并且滿足轉(zhuǎn)移條件,則無(wú)條件遠(yuǎn)轉(zhuǎn)移的起始地址是INT—CS*10h+INT—IP,目的地址是36816*1011+ (INT—IP+ (rell6+5) &FFFFh)。無(wú)條件遠(yuǎn)轉(zhuǎn)移指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。無(wú)條件遠(yuǎn)轉(zhuǎn)移指令的機(jī)器碼為EA segl6 rel16,其中EA是操作碼,segl6 rell6是操作數(shù),segl6是無(wú)條件遠(yuǎn)轉(zhuǎn)移指令的下一條指令的段地址,rell6是無(wú)條件遠(yuǎn)轉(zhuǎn)移指令的下一條指令的位移地址,segl6與rell6均是16位的數(shù)據(jù)。
若下一條指令是近調(diào)用指令(Call Near)并且滿足轉(zhuǎn)移條件,則近調(diào)用的起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rell6+3) &FFFFh)。近調(diào)用指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。近調(diào)用指令的機(jī)器碼為E8 rel16,其中E8是操作碼,rell6是操作數(shù),表示近調(diào)用指令的下一條指令地址與目的地址之間的16位地址位移量。
若下一條指令是遠(yuǎn)調(diào)用指令(Call Far)并且滿足轉(zhuǎn)移條件,則遠(yuǎn)調(diào)用的起始地址是INT—CS*10h+INT—IP,目的地址是36816*1011+ (INT—IP+ (rell6+5) &FFFFh)。遠(yuǎn)調(diào)用指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。遠(yuǎn)調(diào)用指令的機(jī)器碼為9A segl6 rel16,其中9A是操作碼,segl6 rell6是操作數(shù),segl6是遠(yuǎn)調(diào)用指令的下一條指令的段地址,rell6是遠(yuǎn)調(diào)用指令的下一條指令的位移地址。
若下一條指令是近返回指令(Ret Near)并且滿足轉(zhuǎn)移條件,則近返回的起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+CALL—IP。近返回指令的機(jī)器碼、操作碼、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。近返回指令的機(jī)器碼及操作碼均為C3。
若下一條指令是遠(yuǎn)返回指令(Ret Far)并且滿足轉(zhuǎn)移條件,則遠(yuǎn)返回的起始地址是INT—CS*10h+INT—IP,目的地址是CALL—Far—CS*10h+CALL—IP。遠(yuǎn)返回指令的機(jī)器碼、操作碼
10、助記符、轉(zhuǎn)移條件及對(duì)應(yīng)的目的地址、起始地址參見圖9所示。遠(yuǎn)返回指令的機(jī)器碼及操 作碼均為CB。
上述計(jì)算各類控制轉(zhuǎn)移指令的起始地址及目的地址中所述的re18、 rel16、 segl6 rell6都是指令的操作數(shù),可參照步驟S402的方法通過(guò)讀取指令的操作數(shù)得到。
步驟S406,轉(zhuǎn)移處理模塊114儲(chǔ)存起始地址及目的地址。可以將起始地址及目的地址儲(chǔ) 存到內(nèi)存或是磁盤中。在本實(shí)施例中將起始地址及目的地址儲(chǔ)存到內(nèi)存的環(huán)形緩沖區(qū)中,具 體方法如下讀取環(huán)形緩沖區(qū)的索引值得到要儲(chǔ)存的地址,將起始地址及目的地址儲(chǔ)存到該 儲(chǔ)存地址中,然后計(jì)算下一個(gè)儲(chǔ)存地址是否超出該環(huán)形緩沖區(qū)的容量,若超出則將下一個(gè)儲(chǔ) 存地址設(shè)定為該環(huán)形緩沖區(qū)的第一個(gè)儲(chǔ)存地址。
步驟S407,輔助除錯(cuò)模塊115進(jìn)行程序追蹤以外的輔助除錯(cuò)處理,例如檢査CX的值是否 不正常。在原程序12的執(zhí)行過(guò)程中CX的值有可能發(fā)生不正常的借位減法,如當(dāng)CX的值為"0 "并執(zhí)行LOOP指令后,CPU會(huì)自動(dòng)將CX的值減"1" , CX的值由"0"變成FFFFh而繼續(xù)執(zhí)行循 環(huán)內(nèi)容。
步驟S408,寄存器出棧模塊116將進(jìn)入INT1中斷處理程序時(shí)壓入堆棧的寄存器的值彈出 堆棧并返回原程序12。將步驟S401其他需要使用的寄存器彈出堆棧。CPU在離開INT1時(shí)自動(dòng) 將進(jìn)入INT1中斷處理程序時(shí)壓入堆棧的INT—IP與INT—CS彈出到寄存器IP與寄存器CS,將 INT—FLAGS彈出到寄存器Flags,使得CPU重新置成單步方式,并且將寄存器CS、 IP恢復(fù)到中 斷前的值。
上述步驟S40廣步驟S408是INT1中斷處理程序中的處理步驟。每執(zhí)行原程序12的一條指 令進(jìn)入INT1中斷處理程序時(shí)都執(zhí)行步驟S40廣步驟S408 。
權(quán)利要求
權(quán)利要求1一種計(jì)算機(jī)程序除錯(cuò)系統(tǒng),用于中央處理器工作在在系統(tǒng)管理模式下對(duì)原程序的執(zhí)行過(guò)程進(jìn)行追蹤,其特征在于,該系統(tǒng)包括追蹤標(biāo)志設(shè)置模塊,用于將中央處理器的標(biāo)志寄存器的追蹤標(biāo)志設(shè)置為“1”;寄存器入棧模塊,用于在執(zhí)行完原程序的一條指令后將除錯(cuò)過(guò)程中需要使用的寄存器的值壓入堆棧;操作碼讀取模塊,用于讀取原程序的下一條指令的操作碼并判斷該下一條指令的類型;標(biāo)志出棧處理模塊,用于當(dāng)原程序的下一條指令是標(biāo)志出棧指令時(shí),將該標(biāo)志出棧指令將要儲(chǔ)存的追蹤標(biāo)志設(shè)置為“1”;轉(zhuǎn)移處理模塊,用于當(dāng)原程序的下一條指令是控制轉(zhuǎn)移指令并滿足轉(zhuǎn)移條件時(shí),計(jì)算轉(zhuǎn)移的起始地址及目的地址,并儲(chǔ)存該起始地址及目的地址;及寄存器出棧模塊,用于將壓入堆棧的寄存器的值彈出堆棧并返回原程序。
2.如權(quán)利要求l所述的計(jì)算機(jī)程序除錯(cuò)系統(tǒng),其特征在于,該系統(tǒng)還 包括輔助除錯(cuò)模塊,用于對(duì)原程序進(jìn)行追蹤原程序的執(zhí)行過(guò)程以外的錯(cuò)誤檢測(cè)。
3.如權(quán)利要求l所述的計(jì)算機(jī)程序除錯(cuò)系統(tǒng),其特征在于,所述除錯(cuò) 過(guò)程中需要使用的寄存器包括計(jì)數(shù)寄存器、標(biāo)志寄存器、代碼段寄存器及指令指針寄存器。
4.如權(quán)利要求l所述的計(jì)算機(jī)程序除錯(cuò)系統(tǒng),其特征在于,所述控制 轉(zhuǎn)移指令包括條件短轉(zhuǎn)移指令、無(wú)條件短轉(zhuǎn)移指令、條件近轉(zhuǎn)移指令、無(wú)條件近轉(zhuǎn)移指令、 無(wú)條件遠(yuǎn)轉(zhuǎn)移指令、近調(diào)用指令、遠(yuǎn)調(diào)用指令、近返回指令及遠(yuǎn)返回指令。
5.如權(quán)利要求l所述的計(jì)算機(jī)程序除錯(cuò)系統(tǒng),其特征在于,所述起始 地址及目的地址是存儲(chǔ)在內(nèi)存的環(huán)形緩沖區(qū)中。
6. 一種計(jì)算機(jī)程序除錯(cuò)方法,用于中央處理器工作在系統(tǒng)管理模式 下對(duì)原程序的執(zhí)行過(guò)程進(jìn)行追蹤,其特征在于,該方法包括步驟 (a)將中央處理器的標(biāo)志寄存器的追蹤標(biāo)志設(shè)置為"1";(b) 在執(zhí)行完原程序的一條指令后將除錯(cuò)過(guò)程中需要使用的寄存器的值壓入堆棧;(c) 讀取原程序的下一條指令的操作碼并根據(jù)該操作碼判斷該下一條指令的類型;(d) 若原程序的下一條指令是標(biāo)志出棧指令,則將該標(biāo)志出棧指令要儲(chǔ)存的追蹤標(biāo)志設(shè) 置為"1",轉(zhuǎn)到步驟(g);(e) 若原程序的下一條指令是控制轉(zhuǎn)移指令且滿足轉(zhuǎn)移條件,則計(jì)算轉(zhuǎn)移的起始地址及 目的地址,否則直接轉(zhuǎn)到步驟(g);(f) 儲(chǔ)存所述起始地址及目的地址;及(g) 將壓入堆棧的寄存器的值彈出堆棧并返回原程序。
7.如權(quán)利要求6所述的計(jì)算機(jī)程序除錯(cuò)方法,其特征在于,所述步驟 (f)與(g)之間包括步驟對(duì)原程序進(jìn)行追蹤原程序的執(zhí)行過(guò)程以外的錯(cuò)誤檢測(cè)。
8.如權(quán)利要求6所述的計(jì)算機(jī)程序除錯(cuò)方法,其特征在于,所述步驟 (b)中壓入堆棧的寄存器的值包括中斷返回的段地址及中斷返回的偏移地址,用INT—CS表示 中斷返回的段地址,用INT—IP表示中斷返回的偏移地址,在步驟(e)中若下一條指令是條件短轉(zhuǎn)移指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rel8+2) &FFh),其中rel8是條 件短轉(zhuǎn)移指令的下一條指令地址與目的地址之間的八位地址位移量;若下一條指令是無(wú)條件短轉(zhuǎn)移指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rel8+2) &FFh),其中rel8是無(wú) 條件短轉(zhuǎn)移指令的下一條指令地址與目的地址之間的八位地址位移量;若下一條指令是條件近轉(zhuǎn)移指令并且滿足轉(zhuǎn)移條件,并且滿足近轉(zhuǎn)移條件,則轉(zhuǎn)移的 起始地址是INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rell6+4) &FFFFh), 其中rell6是條件近轉(zhuǎn)移指令的下一條指令地址與目的地址之間的十六位地址位移量;若下一條指令是無(wú)條件近轉(zhuǎn)移指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rell6+3) &FFFFh),其中rel16 是無(wú)條件近轉(zhuǎn)移指令的下一條指令地址與目的地址之間的十六位地址位移量;若下一條指令是無(wú)條件遠(yuǎn)轉(zhuǎn)移指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是36816*1011+ (INT—IP+ (rell6+5) &FFFFh),其中segl6是 無(wú)條件遠(yuǎn)轉(zhuǎn)移指令的下一條指令的段地址,rell6是無(wú)條件遠(yuǎn)轉(zhuǎn)移指令的下一條指令的位移 地址;若下一條指令是近調(diào)用指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是INT—CS*10h+ (INT—IP+ (rell6+3) &FFFFh),其中rel16 是近調(diào)用指令的下一條指令地址與目的地址之間的十六位地址位移量;若下一條指令是遠(yuǎn)調(diào)用指令并且滿足轉(zhuǎn)移條件,則遠(yuǎn)調(diào)用的起始地址是 INT—CS*10h+INT—IP,目的地址是36816*1011+ (INT—IP+ (rell6+5) &FFFFh),其中segl6是 遠(yuǎn)調(diào)用指令的下一條指令的段地址,rell6是遠(yuǎn)調(diào)用指令的下一條指令的位移地址;若下一條指令是近返回指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是INT—CS*10h+CALL—IP,其中CALL—IP是近返回所對(duì)應(yīng)的調(diào)用 返回的偏移地址;若下一條指令是遠(yuǎn)返回指令并且滿足轉(zhuǎn)移條件,則轉(zhuǎn)移的起始地址是 INT—CS*10h+INT—IP,目的地址是CALL—Far—CS*10h+CALL—IP,其中CALL—Far—CS是遠(yuǎn)調(diào)用所 對(duì)應(yīng)的調(diào)用返回的段地址,CALL—IP是遠(yuǎn)調(diào)用所對(duì)應(yīng)的調(diào)用返回的偏移地址。
9.如權(quán)利要求6所述的計(jì)算機(jī)程序除錯(cuò)方法,其特征在于,所述除錯(cuò) 過(guò)程中需要使用的寄存器包括計(jì)數(shù)寄存器、標(biāo)志寄存器、代碼段寄存器及指令指針寄存器。
10.如權(quán)利要求6所述的計(jì)算機(jī)程序除錯(cuò)方法,其特征在于,所述儲(chǔ) 存起始地址及目的地址是將起始地址及目的地址儲(chǔ)存到內(nèi)存的環(huán)形緩沖區(qū)中。
全文摘要
一種程序除錯(cuò)方法,該方法包括步驟(a)將標(biāo)志寄存器的追蹤標(biāo)志設(shè)置為“1”;(b)將需要使用的寄存器的值壓入堆棧;(c)讀取下一條指令的操作碼并判斷指令的類型;(d)若是標(biāo)志出棧指令,將要儲(chǔ)存的追蹤標(biāo)志設(shè)置為“1”,轉(zhuǎn)到步驟(g);(e)若是控制轉(zhuǎn)移指令且滿足轉(zhuǎn)移條件,則計(jì)算轉(zhuǎn)移的起始地址及目的地址,否則直接轉(zhuǎn)到步驟(g);(f)儲(chǔ)存起始地址及目的地址;及(g)將壓入堆棧的寄存器的值彈出堆棧并返回原程序。本發(fā)明還提供一種程序除錯(cuò)系統(tǒng)。本發(fā)明能夠在系統(tǒng)模式下追蹤程序的執(zhí)行過(guò)程,從而實(shí)現(xiàn)系統(tǒng)模式下的程序除錯(cuò)。
文檔編號(hào)G06F11/36GK101470661SQ20071020351
公開日2009年7月1日 申請(qǐng)日期2007年12月28日 優(yōu)先權(quán)日2007年12月28日
發(fā)明者賴慶育 申請(qǐng)人:鴻富錦精密工業(yè)(深圳)有限公司;鴻海精密工業(yè)股份有限公司