本發(fā)明涉及計算機技術(shù),尤其涉及一種程序的重寫方法和裝置。
背景技術(shù):
:處理器在執(zhí)行程序段時,在執(zhí)行路徑上經(jīng)常會遇到各種各樣的跳轉(zhuǎn)指令,例如,直接跳轉(zhuǎn)指令或間接跳轉(zhuǎn)指令等。當處理器執(zhí)行到跳轉(zhuǎn)指令后,處理器會跳轉(zhuǎn)到該跳轉(zhuǎn)指令的目標地址上,然后執(zhí)行該目標地址上的指令。但是,對于間接跳轉(zhuǎn)指令而言,一般的,在程序執(zhí)行之前,處理器是不知道間接跳轉(zhuǎn)指令要跳轉(zhuǎn)到的目標地址的,而是在程序執(zhí)行的過程中采用轉(zhuǎn)移猜測的方法去猜測間接跳轉(zhuǎn)指令的目標地址。上述轉(zhuǎn)移猜測的方法能夠?qū)μD(zhuǎn)是否執(zhí)行以及跳轉(zhuǎn)的目標地址兩方面進行預測,其一般可以對程序執(zhí)行路徑上的多條間接跳轉(zhuǎn)指令進行連續(xù)處理和預測,處理器的轉(zhuǎn)移猜測功能可以保證處理器在猜錯時能夠讓處理器回滾到正確狀態(tài),繼續(xù)執(zhí)行。對于間接跳轉(zhuǎn)指令,處理器猜測該間接跳轉(zhuǎn)指令的目標地址具體可以為:處理器根據(jù)該間接跳轉(zhuǎn)指令的歷史跳轉(zhuǎn)信息猜測該間接跳轉(zhuǎn)指令對應的目標寄存器內(nèi)的程序計數(shù)器(ProgramCounter,簡稱PC)值,該PC值即就是該間接跳轉(zhuǎn)指令的目標地址,其存儲在間接跳轉(zhuǎn)指令的目標寄存器中。當處理器猜測到該PC值后,就會根據(jù)該PC值發(fā)出取指操作。但是,當猜測的PC值位于處理器不允許進行取指操作的地址空間(例如Kseg1)時,就有可能造成處理器出現(xiàn)狀態(tài)錯誤,從而導致程序終止或死機。因此,如何避免處理器所猜測的PC值超出合法的取指地址空間,以避免程序的終止或死機,成為目前亟待解決的技術(shù)問題。技術(shù)實現(xiàn)要素:本發(fā)明提供一種程序的重寫方法和裝置,用以解決現(xiàn)有技術(shù)中無法避免 處理器在跳轉(zhuǎn)時,因所猜測的PC值超出合法的取指地址空間,帶來的程序終止或死機的技術(shù)問題。第一方面,本發(fā)明提供一種程序的重寫方法,包括:為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,所述跳板代碼用于將所述間接跳轉(zhuǎn)指令對應的程序計數(shù)器PC值約束在Kseg0內(nèi);將所述跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述跳板代碼在所述新版本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系;根據(jù)所述映射表,將所述新版本程序中位于所述跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為所述跳板代碼在所述新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述跳板代碼。結(jié)合第一方面,在第一方面的第一種可能的實施方式中,所述跳板代碼包括第一跳板代碼和/或第二跳板代碼,所述間接跳轉(zhuǎn)指令包括第一間接指令和/或第二間接跳轉(zhuǎn)指令,所述第一間接跳轉(zhuǎn)指令對應的目標寄存器為R1寄存器,所述第二間接跳轉(zhuǎn)指令對應的目標寄存器為第一寄存器;所述為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,所述跳板代碼用于將所述間接跳轉(zhuǎn)指令對應的程序計數(shù)器PC值約束在Kseg0內(nèi),包括:為所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建所述第一跳板代碼,獲得所述跳板代碼段;或者,為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,獲得所述跳板代碼段;或者,為所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建所述第一跳板代碼,以及,為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,并根據(jù)所述第一跳板代碼和所述第二跳板代碼,獲得所述跳板代碼段;其中,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi);所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi)。結(jié)合第一方面的第一種可能的實施方式,在第一方面的第二種可能的實施方式中,所述映射表包括所述跳板代碼在所述新版本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系,具體為:所述映射表包括所述第一跳板代碼在所述新版本程序中的地址與所述R1寄存器的對應關(guān)系,和/或,所述第二跳板代碼在所述新版本程序中的地址與所述第一寄存器的對應關(guān)系。結(jié)合第一方面的第二種可能的實施方式,在第一方面的第三種可能的實施方式中,所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令包括:位于所述第一跳板代碼之外的第三間接跳轉(zhuǎn)指令,和/或,位于所述第二跳板代碼之外的第四間接跳轉(zhuǎn)指令;其中,所述第三間接跳轉(zhuǎn)指令與所述第一間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第三間接跳轉(zhuǎn)指令的目標寄存器為R1寄存器,所述第四間接跳轉(zhuǎn)指令與所述第二間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第四間接跳轉(zhuǎn)指令的目標寄存器為第一寄存器;所述根據(jù)所述映射表,將所述新版本程序中位于所述跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為所述跳板代碼在所述新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令時跳轉(zhuǎn)執(zhí)行所述跳板代碼段,包括:根據(jù)所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼;或者,根據(jù)所述映射表,將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼;或者,根據(jù)所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,并將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼,以及,在 所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。結(jié)合第一方面至第一方面的第三種可能的實施方式中的任一項,在第一方面的第四種可能的實施方式中,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi),具體為:所述第一跳板代碼,用于確定所猜測的所述第一PC值是否正確,以將所述第一PC值約束在Kseg0內(nèi)。結(jié)合第一方面的第四種可能的實施方式,在第一方面的第五種可能的實施方式中,所述第一跳板代碼包括至少一條空指令和所述第一間接跳轉(zhuǎn)指令;所述空指令用于確定所猜測的第一PC值是否正確;所述方法還包括:執(zhí)行所述改寫后的新版本程序,并當執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述第一跳板代碼;當執(zhí)行所述空指令后確定所猜測的第一PC值正確時,繼續(xù)執(zhí)行所述第一跳板代碼中的所述第一間接跳轉(zhuǎn)指令;當執(zhí)行所述空指令后確定所猜測的第一PC值錯誤時,回退至所述第一跳板代碼在所述新版本程序中的地址上,以重新執(zhí)行所述第一跳板代碼。結(jié)合第一方面至第一方面的第三種可能的實施方式中的任一項,在第一方面的第六種可能的實施方式中,所述第二跳板代碼包括按位與指令和第二間接跳轉(zhuǎn)指令;所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi),具體為:所述按位與指令,用于將所述R1寄存器中的立即數(shù)0xDFFF,FFFF與所述第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間進行按位與,以將所述第二PC值約束在Kseg0內(nèi)。結(jié)合第一方面的第一種可能的實施方式,在第一方面的第七種可能的實施方式中,所述根據(jù)所述第一跳板代碼和所述第二跳板代碼,獲得所述跳板代碼段,具體包括:將所述第一跳板代碼和所述第二跳板代碼按照所對應的寄存器編號從小到大排列,獲得所述跳板代碼段。結(jié)合第一方面的第三種可能的實施方式,在第一方面的第八種可能的實 施方式中,所述第一間接跳轉(zhuǎn)指令為jrreg1或jalrreg1,所述第二間接跳轉(zhuǎn)指令為jrregN或jalrregN,所述N為大于1小于等于31的正整數(shù),所述第一跳板代碼在所述新版本程序中的地址為StubR1,所述第二跳板代碼在所述新版本程序中的地址為StubRN;則所述根據(jù)所述映射表,將所述新版本程序中第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,具體包括:根據(jù)所述映射表,將所述新版本程序中第三間接跳轉(zhuǎn)指令jrreg1中的reg1修改為StubR1,或者,將jalrreg1中的reg1修改為StubR1;所述根據(jù)所述映射表,將所述新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,具體包括:將所述新版本程序中第四間接跳轉(zhuǎn)指令jrregN中的regN修改為StubRN,或者,將jalrregN中的regN修改為StubRN。結(jié)合第一方面的第八種可能的實施方式,在第一方面的第九種可能的實施方式中,當所述第一寄存器為RN時,所述第二跳板代碼中的第二間接跳轉(zhuǎn)指令為jrregN或jalrregN。第二方面,本發(fā)明提供一種程序的重寫裝置,包括:跳板代碼構(gòu)建模塊,用于為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,所述跳板代碼用于將所述間接跳轉(zhuǎn)指令對應的程序計數(shù)器PC值約束在Kseg0內(nèi);第一獲取模塊,用于將所述跳板代碼構(gòu)建獲取模塊所獲得的跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述跳板代碼在所述新版本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系;第二獲取模塊,用于根據(jù)所述第一獲取模塊獲得的所述映射表,將所述新版本程序中位于所述跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為所述跳板代碼在所述新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述跳板代碼。結(jié)合第二方面,在第二方面的第一種可能的實施方式中,所述跳板代碼包括第一跳板代碼和/或第二跳板代碼,所述間接跳轉(zhuǎn)指令包括第一間接指令 和/或第二間接跳轉(zhuǎn)指令,所述第一間接跳轉(zhuǎn)指令對應的目標寄存器為R1寄存器,所述第二間接跳轉(zhuǎn)指令對應的目標寄存器為第一寄存器;則所述跳板代碼構(gòu)建模塊,具體用于為所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建所述第一跳板代碼,獲得所述跳板代碼段;或者,所述跳板代碼構(gòu)建模塊,具體用于為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,獲得所述跳板代碼段;或者,所述跳板代碼構(gòu)建模塊,具體用于為所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建所述第一跳板代碼,以及,為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,并根據(jù)所述第一跳板代碼和所述第二跳板代碼,獲得所述跳板代碼段;其中,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi);所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi)。結(jié)合第二方面的第一種可能的實施方式,在第二方面的第二種可能的實施方式中,所述映射表包括所述跳板代碼在所述新版本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系,具體為:所述映射表包括所述第一跳板代碼在所述新版本程序中的地址與所述R1寄存器的對應關(guān)系,和/或,所述第二跳板代碼在所述新版本程序中的地址與所述第一寄存器的對應關(guān)系。結(jié)合第二方面的第二種可能的實施方式,在第二方面的第三種可能的實施方式中,所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令包括:位于所述第一跳板代碼之外的第三間接跳轉(zhuǎn)指令,和/或,位于所述第二跳板代碼之外的第四間接跳轉(zhuǎn)指令;其中,所述第三間接跳轉(zhuǎn)指令與所述第一間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第三間接跳轉(zhuǎn)指令的目標寄存器為R1寄存器,所述第四間接跳轉(zhuǎn)指令與所述第二間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第四間接跳轉(zhuǎn)指令的目標寄存器為第一寄存器;則所述第二獲取模塊,具體用于根據(jù)所述第一獲取模塊獲得的所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第 一跳板代碼;或者,所述第二獲取模塊,具體用于根據(jù)所述第一獲取模塊獲得的所述映射表,將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼;或者,所述第二獲取模塊,具體用于根據(jù)所述第一獲取模塊獲得的所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,并將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼,以及,在所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。結(jié)合第二方面至第二方面的第三種可能的實施方式中的任一項,在第二方面的第四種可能的實施方式中,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi),具體為:所述第一跳板代碼,用于確定所猜測的所述第一PC值是否正確,以將所述第一PC值約束在Kseg0內(nèi)。結(jié)合第二方面的第四種可能的實施方式,在第二方面的第五種可能的實施方式中,所述第一跳板代碼包括至少一條空指令和所述第一間接跳轉(zhuǎn)指令;所述空指令用于確定所猜測的第一PC值是否正確;所述裝置還包括:處理模塊,用于執(zhí)行所述改寫后的新版本程序,并當執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述第一跳板代碼;判斷執(zhí)行模塊,用于在執(zhí)行所述空指令后確定所猜測的第一PC值正確時,指示所述處理模塊繼續(xù)執(zhí)行所述第一跳板代碼中的所述第一間接跳轉(zhuǎn)指令;并用于在執(zhí)行所述空指令后確定所猜測的第一PC值錯誤時,指示所述處理模塊回退至所述第一跳板代碼在所述新版本程序中的地址上,以重新執(zhí)行所述第一跳板代碼。結(jié)合第二方面至第二方面的第三種可能的實施方式中的任一項,在第二方面的第六種可能的實施方式中,所述第二跳板代碼包括按位與指令和第二 間接跳轉(zhuǎn)指令;所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi),具體為:所述按位與指令,用于將所述R1寄存器中的立即數(shù)0xDFFF,FFFF與所述第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間進行按位與,以將所述第二PC值約束在Kseg0內(nèi)。結(jié)合第二方面的第一種可能的實施方式,在第二方面的第七種可能的實施方式中,所述跳板代碼構(gòu)建模塊,具體用于根據(jù)所述第一跳板代碼和所述第二跳板代碼,獲得所述跳板代碼段,具體為:所述跳板代碼構(gòu)建模塊,具體用于將所述第一跳板代碼和所述第二跳板代碼按照所對應的寄存器編號從小到大排列,獲得所述跳板代碼段。結(jié)合第二方面的第三種可能的實施方式,在第二方面的第八種可能的實施方式中,所述第一間接跳轉(zhuǎn)指令為jrreg1或jalrreg1,所述第二間接跳轉(zhuǎn)指令為jrregN或jalrregN,所述N為大于1小于等于31的正整數(shù),所述第一跳板代碼在所述新版本程序中的地址為StubR1,所述第二跳板代碼在所述新版本程序中的地址為StubRN;則所述第二獲取模塊,具體用于根據(jù)所述映射表,將所述新版本程序中第三間接跳轉(zhuǎn)指令jrreg1中的reg1修改為StubR1,或者,將jalrreg1中的reg1修改為StubR1;以及,具體用于將所述新版本程序中第四間接跳轉(zhuǎn)指令jrregN中的regN修改為StubRN,或者,將jalrregN中的regN修改為StubRN。結(jié)合第二方面的第八種可能的實施方式,在第二方面的第九種可能的實施方式中,當所述第一寄存器為RN時,所述第二跳板代碼中的第二間接跳轉(zhuǎn)指令為jrregN或jalrregN。本發(fā)明提供的程序的重寫方法和裝置,通過為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,并將該跳板代碼段添加至待處理程序的起始地址空間,獲得新版本程序以及映射表,并根據(jù)該映射表將新版本程序中位于該跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為該跳板代碼在新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到位于跳板代碼之外的間接跳轉(zhuǎn)指令時跳轉(zhuǎn)執(zhí)行該跳板代碼。由于該跳板代碼可以將所猜測的PC值約束在Kseg0內(nèi),因此避免了處理器在錯誤 的PC上進行取指帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。附圖說明圖1為本發(fā)明提供的程序的重寫方法實施例一的流程示意圖;圖2為本發(fā)明提供的程序的重寫方法實施例二的流程示意圖;圖3為本發(fā)明提供的程序的重寫方法實施例三的流程示意圖;圖4為本發(fā)明提供的程序的重寫方法實施例四的流程示意圖;圖5為本發(fā)明提供的程序的重寫方法實施例五的流程示意圖;圖6為本發(fā)明提供的待處理程序中的間接跳轉(zhuǎn)指令的重寫過程示意圖;圖7為本發(fā)明提供的程序的重寫裝置實施例一的結(jié)構(gòu)示意圖;圖8為本發(fā)明提供的程序的重寫方裝置實施例二的結(jié)構(gòu)示意圖。具體實施方式本發(fā)明涉及的方法可以適用于處理器在執(zhí)行程序時進行指令跳轉(zhuǎn)的場景,該方法的執(zhí)行主體可以為處理器,也可以為集成了處理器的通信設備,例如計算機、平板電腦、服務器等。下述實施例以執(zhí)行主體為處理器為例來進行說明。需要說明的是,本發(fā)明實施例涉及的“A,和/或,B”,可以包括“A”、“B”、“A和B”三種情況。本發(fā)明實施例涉及的方法,旨在解決現(xiàn)有技術(shù)中無法避免處理器在跳轉(zhuǎn)時,因所猜測的PC值超出合法的取指地址空間,帶來的程序終止或死機的技術(shù)問題。下面以具體地實施例對本發(fā)明的技術(shù)方案進行詳細說明。下面這幾個具體的實施例可以相互結(jié)合,對于相同或相似的概念或過程可能在某些實施例不再贅述。圖1為本發(fā)明提供的程序的重寫方法實施例一的流程示意圖。本實施例涉及的方法是通過為待處理程序中的間接跳轉(zhuǎn)指令對應的目標寄存器構(gòu)建跳板代碼,并將所構(gòu)建的跳板代碼添加至待處理程序中形成新版本的程序,從而根據(jù)跳板代碼在新版本程序中的地址對原始的間接跳轉(zhuǎn)指令進行重寫,以 使計算機在執(zhí)行到上述間接跳轉(zhuǎn)指令時可以跳轉(zhuǎn)執(zhí)行對應的跳板代碼,進而使得處理器可以通過執(zhí)行該跳板代碼來確保所猜測的PC值位于合法的取指地址空間的具體過程。如圖1所示,該方法包括:S101:為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,所述跳板代碼用于將所述間接跳轉(zhuǎn)指令對應的程序計數(shù)器PC值約束在Kseg0內(nèi)。具體的,待處理程序為處理器即將要執(zhí)行的程序,該待處理程序中包括至少一條間接跳轉(zhuǎn)指令,該每一條間接跳轉(zhuǎn)指令都對應相應的目標寄存器。需要說明的是,目標寄存器可以為32個通用寄存器中的除R0外的任一個通用寄存器,本實施例中,處理器會對每一條間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,可選的,當待處理程序中的所包括的間接跳轉(zhuǎn)指令的類型不同時,所構(gòu)建的跳板代碼有可能不同。當處理器對所有間接跳轉(zhuǎn)指令構(gòu)建完跳板代碼后,根據(jù)這些跳板代碼獲得跳板代碼段。一般的,處理器在執(zhí)行待處理器程序中,對于待處理程序中涉及到的間接跳轉(zhuǎn)指令,處理器一般會猜測該間接跳轉(zhuǎn)指令的目標地址,具體可以為:處理器根據(jù)該間接跳轉(zhuǎn)指令的歷史跳轉(zhuǎn)信息猜測該間接跳轉(zhuǎn)指令對應的目標寄存器內(nèi)的PC值,該PC值即就是該間接跳轉(zhuǎn)指令的目標地址,其存儲在該間接跳轉(zhuǎn)指令對應的目標寄存器中。當處理器猜測到該PC值后,就會根據(jù)該PC值發(fā)出取指操作,但是,當猜測的PC值位于處理器不允許進行取指操作的地址空間(例如Kseg1)時,就有可能造成處理器出現(xiàn)狀態(tài)錯誤,從而導致程序終止或死機。因此,本實施例中,上述為目標寄存器構(gòu)建的跳板代碼,其主要用于將間接跳轉(zhuǎn)指令的目標地址(即上述PC值)約束在Kseg0內(nèi),因此可以確保間接跳轉(zhuǎn)指令可以位于合法的地址空間內(nèi),不會造成跳轉(zhuǎn)錯誤。可選的,該跳板代碼可以為具有判斷PC值是否位于Kseg0內(nèi)的功能的指令,或者還可以為經(jīng)過一定的邏輯運算將PC值限制在Keg0內(nèi)的指令。需要說明的是,上述合法地址空間Kseg0的地址空間為(0x8000,0000—0x9FFFF,FFFF),共512M;上述不允許進行取指操作的Kseg1的地址空間為(0xA000,0000—0xBFFFF,FFFF),共512M。S102:將所述跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述跳板代碼在所述新版 本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系。具體的,當處理器將上述跳板代碼段存儲至上述待處理程序的起始位置后,處理器會獲得一新版本程序和映射表,該新版本程序中包括上述跳板代碼段和原來的待處理程序。由于上述跳板代碼是與間接跳轉(zhuǎn)指令的目標寄存器對應的,因此上述映射表可以包括該跳板代碼在新版本程序中的地址和與該跳板代碼對應的間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系,即一個目標寄存器與其對應的跳板代碼的地址之間具有映射關(guān)系。S103:根據(jù)所述映射表,將所述新版本程序中位于所述跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為所述跳板代碼在所述新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述跳板代碼。具體的,當處理器獲得新版本的程序和上述映射表之后,處理器對新版本程序中位于跳板代碼之外的間接跳轉(zhuǎn)指令進行改寫,獲得改寫后的新版本程序,即處理器將上述新版本程序中位于跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為該跳板代碼在新版本程序中的地址。故,處理器在執(zhí)行到位于上述跳板代碼之外的間接跳轉(zhuǎn)指令時,可以直接跳轉(zhuǎn)執(zhí)行所述跳板代碼。由于處理器在執(zhí)行到位于上述跳板代碼之外的間接跳轉(zhuǎn)指令時,所猜測的PC值有可能是錯誤的,因此當處理器執(zhí)行到位于上述跳板代碼之外的間接跳轉(zhuǎn)指令時,可以直接跳轉(zhuǎn)執(zhí)行所述跳板代碼,由于該跳板代碼可以將所猜測的PC值約束在合法的地址空間Kseg0內(nèi),因此一定程度上避免了處理器在錯誤的PC上進行取指。故,本發(fā)明提供的方法,可以避免處理器在執(zhí)行跳轉(zhuǎn)指令時,因所猜測的PC值超出合法的取指地址空間,帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。本發(fā)明提供的程序的重寫方法,通過為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,并將該跳板代碼段添加至待處理程序的起始地址空間,獲得新版本程序以及映射表,并根據(jù)該映射表將新版本程序中位于該跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為該跳板代碼在新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到位于跳板代碼之外的間接跳轉(zhuǎn)指令時跳轉(zhuǎn)執(zhí)行該跳板代碼。由于該跳板代碼可以將所猜測的PC值約束在Kseg0內(nèi),因此避免了處理器在錯誤的PC上 進行取指帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。圖2為本發(fā)明提供的程序的重寫方法實施例二的流程示意圖。本實施例涉及的是當跳板代碼包括第一跳板代碼,間接跳轉(zhuǎn)指令包括第一間接跳轉(zhuǎn)指令,且上述位于跳板代碼之外的間接跳轉(zhuǎn)指令為第三間接跳轉(zhuǎn)指令時,處理器可以通過執(zhí)行該第一跳板代碼來確保所猜測的第一PC值位于合法的取指地址空間的具體過程。其中,該第一間接跳轉(zhuǎn)指令對應的目標寄存器為R1寄存器,所述第三間接跳轉(zhuǎn)指令與所述第一間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第三間接跳轉(zhuǎn)指令的目標寄存器也為R1寄存器。如圖2所示,該方法包括:S201:為待處理程序中的所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建第一跳板代碼,獲得所述跳板代碼段,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi)。具體的,本實施例中,將跳轉(zhuǎn)至R1寄存器的間接跳轉(zhuǎn)指令稱為第一間接跳轉(zhuǎn)指令,即,第一間接跳轉(zhuǎn)指令與R1寄存器對應。可選的,該第一間接跳轉(zhuǎn)指令可以為jrreg1,還可以為jalrreg1,還可以為其他的跳轉(zhuǎn)指令。當處理器為第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建第一跳板代碼后,根據(jù)該第一跳板代碼獲得跳板代碼段。一般的,處理器在執(zhí)行待處理器程序中,對于待處理程序中涉及到的間接跳轉(zhuǎn)指令,處理器一般會猜測該間接跳轉(zhuǎn)指令的目標地址,具體可以為:處理器根據(jù)該間接跳轉(zhuǎn)指令的歷史跳轉(zhuǎn)信息猜測該間接跳轉(zhuǎn)指令對應的目標寄存器內(nèi)的PC值,該PC值即就是該間接跳轉(zhuǎn)指令的目標地址,其存儲在該間接跳轉(zhuǎn)指令對應的目標寄存器中。當處理器猜測到該PC值后,就會根據(jù)該PC值發(fā)出取指操作,但是,當猜測的PC值位于處理器不允許進行取指操作的地址空間(例如Kseg1)時,就有可能造成處理器出現(xiàn)狀態(tài)錯誤,從而導致程序終止或死機。因此,本實施例中,上述為R1寄存器構(gòu)建的第一跳板代碼,其主要用于將處理器所猜測的第一間接跳轉(zhuǎn)指令對應的位于R1寄存器中的第一PC值約束在Kseg0內(nèi)。因此,由于上述第一跳板代碼對處理器所猜測的第一PC值具有約束功能,使得處理器所猜測的第一PC值不會位于不合法的取指空間內(nèi)。至于第一跳板代碼在待處理程序中如何設定以及如何使用,可以參見下述S202和S203的具體描述。S202:將所述跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述第一跳板代碼在所述新版本程序中的地址與所述R1寄存器的對應關(guān)系。S203:根據(jù)所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼。具體的,上述處理器所獲得的新版本程序包括第三間接跳轉(zhuǎn)指令、第一跳板代碼以及其他指令,該第三間接跳轉(zhuǎn)指令為上述新版本程序中位于所述第一跳板代碼之外的間接跳轉(zhuǎn)指令,第三間接跳轉(zhuǎn)指令與第一間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第三間接跳轉(zhuǎn)指令的目標寄存器為R1寄存器。當處理器獲得新版本的程序和上述映射表之后,處理器對新版本程序中的第三間接跳轉(zhuǎn)指令進行改寫,獲得改寫后的新版本程序,即處理器將上述新版本程序中的第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在新版本程序中的地址,故,處理器在執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時可以直接跳轉(zhuǎn)執(zhí)行所述第一跳板代碼。由于處理器在執(zhí)行第三間接跳轉(zhuǎn)指令所在的地址時,所猜測的第一PC值有可能是錯誤的(因為第三間接跳轉(zhuǎn)指令的內(nèi)容與第一間接跳轉(zhuǎn)指令的內(nèi)容相同,所以處理器猜測的第三間接跳轉(zhuǎn)指令對應的PC值也是第一PC值),因此當處理器執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時,可以直接跳轉(zhuǎn)執(zhí)行第一跳板代碼,由于該第一跳板代碼可以將第一PC值約束在Kseg0內(nèi),因此一定程度上避免了處理器在錯誤的PC上進行取指。故,本發(fā)明提供的方法,可以避免處理器在執(zhí)行跳轉(zhuǎn)指令時,因所猜測的第一PC值超出合法的取指地址空間,帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。本發(fā)明提供的程序的重寫方法,通過為第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建第一跳板代碼,獲得跳板代碼段,并將該跳板代碼段添加至待處理程序的起始地址空間,獲得新版本程序以及映射表,并根據(jù)該映射表將新版本程序中第三間接跳轉(zhuǎn)指令的目標寄存器修改為第一跳板代碼在新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到第三間接跳轉(zhuǎn)指令時跳轉(zhuǎn)執(zhí)行第一跳板代碼。由于該第一跳板代碼可以將第一PC值約束在 Kseg0內(nèi),因此避免了處理器在錯誤的PC上進行取指帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。圖3為本發(fā)明提供的程序的重寫方法實施例三的流程示意圖。本實施例涉及的是當跳板代碼包括第二跳板代碼,間接跳轉(zhuǎn)指令包括第二間接跳轉(zhuǎn)指令,且上述位于跳板代碼之外的間接跳轉(zhuǎn)指令為第四間接跳轉(zhuǎn)指令時,處理器可以通過執(zhí)行該第二跳板代碼來確保所猜測的第二PC值位于合法的取指地址空間的具體過程。其中,該第二間接跳轉(zhuǎn)指令對應的目標寄存器為第一寄存器,該第一寄存器可以為32個通用寄存器中除R0寄存器和R1寄存器之外的一個通用寄存器,所述第四間接跳轉(zhuǎn)指令與所述第二間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第四間接跳轉(zhuǎn)指令的目標寄存器也為第一寄存器。如圖3所示,該方法包括:S301:為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,獲得所述跳板代碼段,所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi)。具體的,本實施例中,將跳轉(zhuǎn)至第一寄存器的間接跳轉(zhuǎn)指令稱為第二間接跳轉(zhuǎn)指令,即,第二間接跳轉(zhuǎn)指令與第一寄存器對應。在本實施例中,將32個通用寄存器進行分類,其中,R0寄存器中單獨的一類寄存器(R0是常值0,不存在間接跳轉(zhuǎn)指令跳轉(zhuǎn)到R0的情況發(fā)生),R1寄存器為單獨的一類寄存器(R1寄存器為便簽寄存器),R2-R31為單獨的一類寄存器,統(tǒng)稱為第一寄存器。上述第二間接跳轉(zhuǎn)指令可以為jrregN,還可以為jalrregN,其中,N為大于1小于等于31的正整數(shù),第二間接跳轉(zhuǎn)指令還可以為其他的跳轉(zhuǎn)指令。當處理器為第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建第二跳板代碼后,根據(jù)該第二跳板代碼獲得跳板代碼段。一般的,處理器在執(zhí)行待處理器程序中,對于待處理程序中涉及到的間接跳轉(zhuǎn)指令,處理器一般會猜測該間接跳轉(zhuǎn)指令的目標地址,具體可以為:處理器根據(jù)該間接跳轉(zhuǎn)指令的歷史跳轉(zhuǎn)信息猜測該間接跳轉(zhuǎn)指令對應的目標寄存器內(nèi)的PC值,該PC值即就是該間接跳轉(zhuǎn)指令的目標地址,其存儲在該間接跳轉(zhuǎn)指令對應的目標寄存器中。當處理器猜測到該PC值后,就會根據(jù)該PC值發(fā)出取指操作,但是,當猜測的PC值位于處理器不允許進行取指操作的地址空間(例如Kseg1)時,就有 可能造成處理器出現(xiàn)狀態(tài)錯誤,從而導致程序終止或死機。因此,本實施例中,上述為第一寄存器構(gòu)建的第二跳板代碼,其主要用于將處理器所猜測的第二間接跳轉(zhuǎn)指令對應的位于第一寄存器中的第二PC值約束在Kseg0內(nèi)。因此,由于上述第二跳板代碼對處理器所猜測的第二PC值具有約束功能,使得處理器所猜測的第二PC值不會位于不合法的取指空間內(nèi)。至于第二跳板代碼在待處理程序中如何設定以及如何使用,可以參見下述S302和S303的具體描述。S302:將所述跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述第二跳板代碼在所述新版本程序中的地址與所述第一寄存器的對應關(guān)系。S303:根據(jù)所述映射表,將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。具體的,上述處理器所獲得的新版本程序包括第四間接跳轉(zhuǎn)指令、第二跳板代碼以及其他指令,該第四間接跳轉(zhuǎn)指令為上述新版本程序中位于所述第二跳板代碼之外的間接跳轉(zhuǎn)指令,第四間接跳轉(zhuǎn)指令與第二間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第四間接跳轉(zhuǎn)指令的目標寄存器為第一寄存器。當處理器獲得新版本的程序和上述映射表之后,處理器對新版本程序中的第四間接跳轉(zhuǎn)指令進行改寫,獲得改寫后的新版本程序,即處理器將上述新版本程序中的第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在新版本程序中的地址,故,處理器在執(zhí)行到第四間接跳轉(zhuǎn)指令所在的地址時可以直接跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。由于處理器在執(zhí)行第四間接跳轉(zhuǎn)指令時,所猜測的第二PC值有可能是錯誤的(因為第四間接跳轉(zhuǎn)指令的內(nèi)容與第二間接跳轉(zhuǎn)指令的內(nèi)容相同,所以處理器猜測的第四間接跳轉(zhuǎn)指令對應的PC值也是第二PC值),因此當處理器執(zhí)行到第四間接跳轉(zhuǎn)指令所在的地址時,可以直接跳轉(zhuǎn)執(zhí)行第二跳板代碼,由于該第二跳板代碼可以將第二PC值約束在Kseg0內(nèi),因此一定程度上避免了處理器在錯誤的PC上進行取指。故,本發(fā)明提供的方法,可以避免處理器在執(zhí)行跳轉(zhuǎn)指令時,因所猜測的第二PC值超出合法的取指地址空 間,帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。本發(fā)明提供的程序的重寫方法,通過為第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建第二跳板代碼,獲得跳板代碼段,并將該跳板代碼段添加至待處理程序的起始地址空間,獲得新版本程序以及映射表,并根據(jù)該映射表將新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器修改為第二跳板代碼在新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行第二跳板代碼。由于該第二跳板代碼可以將第二PC值約束在Kseg0內(nèi),因此避免了處理器在錯誤的PC上進行取指帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。圖4為本發(fā)明提供的程序的重寫方法實施例四的流程示意圖。本實施例與上述實施例二和實施例三不同,本實施例涉及的是當跳板代碼包括第一跳板代碼和第二跳板代碼,間接跳轉(zhuǎn)指令包括第一間接跳轉(zhuǎn)指令和第二間接跳轉(zhuǎn)指令,且上述位于跳板代碼之外的間接跳轉(zhuǎn)指令包括第三間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令時,處理器可以通過執(zhí)行該第一跳板代碼和第二跳板代碼來確保所猜測的第一PC值和第二PC值位于合法的取指地址空間的具體過程。其中,該第一間接跳轉(zhuǎn)指令對應的目標寄存器為R1寄存器,所述第三間接跳轉(zhuǎn)指令與所述第一間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第三間接跳轉(zhuǎn)指令的目標寄存器也為R1寄存器,該第二間接跳轉(zhuǎn)指令對應的目標寄存器為第一寄存器,所述第四間接跳轉(zhuǎn)指令與所述第二間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第四間接跳轉(zhuǎn)指令的目標寄存器也為第一寄存器。如圖4所示,該方法包括:S401:為待處理程序中的第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建第一跳板代碼以及為第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建第二跳板代碼,獲得跳板代碼段;其中,所述第一跳板代碼用于確定所猜測的所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi);所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi)。具體的,本實施例中,為第一間接跳轉(zhuǎn)指令構(gòu)建第一跳板代碼,以及為第二間接跳轉(zhuǎn)指令構(gòu)建第二跳板代碼可以參見上述實施例二和實施例三的具 體描述,在此不再贅述。需要說明的是,當處理器為第一間接跳轉(zhuǎn)指令構(gòu)建第一跳板代碼,以及為第二間接跳轉(zhuǎn)指令構(gòu)建第二跳板代碼之后,獲得跳板代碼段的過程,具體可以為:處理器可以按照寄存器的編號將第一跳板代碼和第二跳板代碼順序排列,形成跳板代碼段。S402:將所述跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述第一跳板代碼在所述新版本程序中的地址與所述R1寄存器的對應關(guān)系,以及,所述第二跳板代碼在所述新版本程序中的地址與所述第一寄存器的對應關(guān)系。具體的,S402的具體過程可以參見上述實施例二和實施例三的具體描述,在此不再贅述。S403:根據(jù)所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,并將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼,以及,在所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。具體的,上述處理器所獲得的新版本程序包括第三間接跳轉(zhuǎn)指令、第四間接跳轉(zhuǎn)指令、第一跳板代碼、第二跳板代碼以及其他指令。當處理器獲得新版本的程序和上述映射表之后,處理器對新版本程序中的第三間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令進行改寫,獲得改寫后的新版本程序,即處理器將上述新版本程序中的第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在新版本程序中的地址,并將第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在新版本程序中的地址,故,處理器在執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時可以直接跳轉(zhuǎn)執(zhí)行所述第一跳板代碼,以及,在所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時,可以直接跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。由于處理器在執(zhí)行第三間接跳轉(zhuǎn)指令時,所猜測的第一PC值有可能是錯誤的(因為第三間接跳轉(zhuǎn)指令的內(nèi)容與第一間接跳轉(zhuǎn)指令的內(nèi)容相同,所 以處理器猜測的第三間接跳轉(zhuǎn)指令對應的PC值也是第一PC值),因此當處理器執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時,可以直接跳轉(zhuǎn)執(zhí)行第一跳板代碼,由于該第一跳板代碼可以確定第一PC值是否正確,因此一定程度上避免了處理器在錯誤的PC上進行取指;另一方面,處理器在執(zhí)行第四間接跳轉(zhuǎn)指令時,所猜測的第二PC值有可能是錯誤的(因為第四間接跳轉(zhuǎn)指令的內(nèi)容與第二間接跳轉(zhuǎn)指令的內(nèi)容相同,所以處理器猜測的第四間接跳轉(zhuǎn)指令對應的PC值也是第二PC值),因此當處理器執(zhí)行到第四間接跳轉(zhuǎn)指令所在的地址時,可以直接跳轉(zhuǎn)執(zhí)行第二跳板代碼,由于該第二跳板代碼可以將所猜測的第二PC值約束在Kseg0內(nèi),因此避免了處理器在錯誤的PC上進行取指。故,本發(fā)明提供的方法,可以避免處理器在執(zhí)行跳轉(zhuǎn)指令時,因所猜測的PC值超出合法的取指地址空間,帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率??蛇x的,本實施例中,該第一間接跳轉(zhuǎn)指令為jrreg1或jalrreg1,第一跳板代碼在所述新版本程序中的地址為StubR1,則上述S403中“將所述新版本程序中第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址”具體可以為:將上述新版本程序中的第三間接跳轉(zhuǎn)指令jrreg1中的reg1修改為StubR1,或者,將jalrreg1中的reg1修改為StubR1”,從而將jrreg1修改為jStubR1,或者,將jalrreg1修改為jalStubR1??蛇x的,當上述第一寄存器為RN時,第二間接跳轉(zhuǎn)指令可以為jrregN或jalrregN,所述N為大于1小于等于31的正整數(shù);上述第二跳板代碼在所述新版本程序中的地址為StubRN。則上述S403中“將所述新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址”具體可以為:將上述新版本程序中的第四間接跳轉(zhuǎn)指令jrregN中的regN,修改為StubRN,或者,將jalrregN中的regN修改為StubRN”,從而將新版本程序中的第四間接跳轉(zhuǎn)指令jrregN修改為jStubRN,或者,將jalrregN修改為jalStubRN。本發(fā)明提供的程序的重寫方法,通過為第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建第一跳板代碼以及為第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建第二跳板代碼,獲得跳板代碼段,并將該跳板代碼段添加至待處理程序的起始地址空間,獲得新版本程序以及映射表,并根據(jù)該映射表將新版本程序中第三間 接跳轉(zhuǎn)指令的目標寄存器修改為第一跳板代碼在新版本程序中的地址,并將新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器修改為第二跳板代碼在新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行第一跳板代碼,以及,在處理器執(zhí)行到第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行第二跳板代碼。由于該第一跳板代碼可以確定第一PC值是否正確,第二跳板代碼可以將所猜測的第二PC值約束在Kseg0內(nèi),因此避免了處理器在錯誤的PC上進行取指帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。為了更好的說明本發(fā)明的技術(shù)方案,下述實施例中均假設間接跳轉(zhuǎn)指令包括第一間接跳轉(zhuǎn)指令和第二間接跳轉(zhuǎn)指令,跳板代碼包括第一跳板代碼和第二跳板代碼,位于跳板代碼之外的間接跳轉(zhuǎn)指令包括位于第一跳板代碼之外的第三間接跳轉(zhuǎn)指令和位于第二跳板代碼之外的第四間接跳轉(zhuǎn)指令。進一步地,在上述實施例四的基礎上,上述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi),具體為:所述第一跳板代碼,用于確定所猜測的所述第一PC值是否正確,以將所述第一PC值約束在Kseg0內(nèi)。具體的,參見圖5所示的實施例五,本實施例涉及的是第一跳板代碼確定所猜測的第一PC值是否正確的具體實現(xiàn)方式。本實施例中,第一跳板代碼包括至少一條空指令和所述第一間接跳轉(zhuǎn)指令,所述空指令用于確定所猜測的第一PC值是否正確。因此,參見圖5所示,該方法還可以包括:S501:執(zhí)行所述改寫后的新版本程序,并當執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述第一跳板代碼。S502:當執(zhí)行所述空指令后確定所猜測的第一PC值正確時,繼續(xù)執(zhí)行所述第一跳板代碼中的所述第一間接跳轉(zhuǎn)指令。S503:當執(zhí)行所述空指令后確定所猜測的第一PC值錯誤時,回退至所述第一跳板代碼在所述新版本程序中的地址上,以重新執(zhí)行所述第一跳板代碼。具體的,本實施例中,上述第一跳板代碼可以包括至少一條空指令和第一間接跳轉(zhuǎn)指令。實際上,待處理程序中,第一間接跳轉(zhuǎn)指令和第三間接跳 轉(zhuǎn)指令的目標寄存器均為R1寄存器。對于所形成的新版本程序,第一跳板代碼中jrreg1或jalrreg1為第一間接跳轉(zhuǎn)指令,位于第一跳板代碼之外的jrreg1或jalrreg1為第三間接跳轉(zhuǎn)指令,第一間接跳轉(zhuǎn)指令和第三間接跳轉(zhuǎn)指令的指令內(nèi)容是相同的。可選的,上述第一跳板代碼可以包括18條空指令。以第一跳板代碼包括3條空指令和jrreg1為例,該第一跳板代碼的代碼序列可以參見表1所示,其中,“ssnop”為本實施例中提到的空指令,“nop”為第一跳板代碼的結(jié)束指令,表1所示的第一跳板代碼在新版本程序中的地址為StubR1。表1從程序執(zhí)行原理來說,當執(zhí)行完上述S403后,上述S402中的新版本程序變化為改寫后的新版本程序,即新版本程序中的第三間接跳轉(zhuǎn)指令的目標寄存器改寫為了第一跳板代碼在新版本程序中的地址(StubR1),上述新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器改寫為了所述第二跳板代碼在新版本程序中的地址,從而獲得改寫后的新版本程序。因此,當處理器執(zhí)行該改寫后的新版本程序時,即當處理器執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時,由于將第三間接跳轉(zhuǎn)指令的目標寄存器改寫為第一跳板代碼在新程序中的地址(StubR1),使得處理器在執(zhí)行到第三間接跳轉(zhuǎn)指令所在的地址時可以直接跳轉(zhuǎn)執(zhí)行第一跳板代碼;但是,由于第一跳板代碼中包括第一間接跳轉(zhuǎn)指令,第一間接跳轉(zhuǎn)指令的內(nèi)容與第三間接跳轉(zhuǎn)指令的內(nèi)容相同,因此,處理器執(zhí)行完上述3條空指令(ssnop)后,會確定第一PC值正確,處理器就可以繼續(xù)執(zhí)行第一跳板代碼中的第一間接跳轉(zhuǎn)指令,相當于經(jīng)過一個第一PC值的正確與否判斷之后,再重新執(zhí)行第三間接跳轉(zhuǎn)指令。這樣的過程可以確保第一PC值的正確,也確保處理器不會造成第三間接跳轉(zhuǎn)指令的執(zhí)行缺漏。在上述實施例四和實施例五的基礎上,本發(fā)明實施例六涉及的是第二跳板代碼的具體實現(xiàn)方式。本實施例中,第二跳板代碼包括按位與指令和第二 間接跳轉(zhuǎn)指令;其中,所述按位與指令,用于將所述R1寄存器中的立即數(shù)0xDFFF,FFFF與所述第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間進行按位與,以將所述第二PC值約束在Kseg0內(nèi)。需要說明的是,當所述第一寄存器為RN時,第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間即就是regN的地址空間。處理器將該regN的地址空間與位于R1寄存器中的0xDFFF,FFFF按位與,可以將regN中的第二PC值約束在Kseg0內(nèi)。本實施例中,第二跳板代碼中的按位與指令用于將所述R1寄存器中的立即數(shù)0xDFFF,FFFF與所述第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間進行按位與,以將所述第二PC值約束在Kseg0內(nèi)。實際上,待處理程序中,第二間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令的目標寄存器均為第一寄存器。對于所形成的新版本程序,第二跳板代碼中jrregN或jalrregN為第二間接跳轉(zhuǎn)指令,位于第二跳板代碼之外的jrregN或jalrregN為第四間接跳轉(zhuǎn)指令,第二間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令的指令內(nèi)容是相同的。以第二跳板代碼包括上述按位與指令和jrregN為例,第二跳板代碼可以參見表2所示,其中,“l(fā)ui$at,0xdfffori$at,$at,0xffff”為位于R1寄存器中的立即數(shù)0xDFFF,FFFF”,“andregN,regN,$at”為按位與指令”。表2所示的第二跳板代碼在新版本程序中的地址為StubRN。表2從程序執(zhí)行原理來說,當執(zhí)行完上述S403后,上述S402中的新版本程序變化為改寫后的新版本程序,即新版本程序中的第三間接跳轉(zhuǎn)指令的目標寄存器改寫為了第一跳板代碼在新版本程序中的地址(StubR1),上述新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器改寫為了所述第二跳板代碼在新版本程序中的地址(StubRN),從而形成改寫后的新版本程序。因此,當處理器執(zhí)行該改寫后的新版本程序時,即當處理器執(zhí)行到第四間接跳轉(zhuǎn)指令所在 的地址時,由于將第四間接跳轉(zhuǎn)指令的目標寄存器改寫為第二跳板代碼在新程序中的地址(StubRN),使得處理器在執(zhí)行到第四間接跳轉(zhuǎn)指令所在的地址時可以跳轉(zhuǎn)執(zhí)行第二跳板代碼;但是,由于第二跳板代碼中包括第二間接跳轉(zhuǎn)指令,第二間接跳轉(zhuǎn)指令的內(nèi)容與第四間接跳轉(zhuǎn)指令的內(nèi)容相同,因此,處理器執(zhí)行完“l(fā)ui$at,0xdfffori$at,$at,0xffffandregN,regN,$at”后,會將第二PC值約束在Kseg0內(nèi),因此處理器就可以繼續(xù)執(zhí)行第二跳板代碼中的第二間接跳轉(zhuǎn)指令,相當于經(jīng)過一個第二PC值的取指空間約束之后,再重新執(zhí)行第四間接跳轉(zhuǎn)指令。這樣的過程可以確保第二PC值的正確,也確保處理器不會造成第四間接跳轉(zhuǎn)指令的執(zhí)行缺漏。結(jié)合上述實施例,還需要說明的是,對于待處理程序中的每條第一間接跳轉(zhuǎn)指令和第二間接跳轉(zhuǎn)指令都要進行相應的跳板代碼的構(gòu)建、改寫等處理。具體可以參見下述圖6所示的是待處理程序中的間接跳轉(zhuǎn)指令的重寫過程示意圖。需要說明的是,下述過程僅是以待處理程序中包括多條第二間接跳轉(zhuǎn)指令為例來進行說明的,當然,下述過程也適用于待處理程序中包括多條第一間接跳轉(zhuǎn)指令,或者包括多條第一間接跳轉(zhuǎn)指令和多條第二間接跳轉(zhuǎn)指令的場景,本發(fā)明在此不再贅述。該方法具體包括:S601:打開并解析待處理程序的elf文件,確定待處理程序在elf文件中的偏移和大小。S602:判斷待處理程序中的每條指令是否改寫完畢;若是,則執(zhí)行S608;若否,則執(zhí)行S603。這里的改寫實際上包括了上述實施例的處理過程,包括為第一間接跳轉(zhuǎn)指令和第二間接跳轉(zhuǎn)指令構(gòu)建相應的跳板代碼、生成跳板代碼段、將跳板代碼段添加至待處理程序的起始位置生成新版本程序、將新版本程序中的第三間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令的目標寄存器進行改寫等過程,將這些過程統(tǒng)稱為對待處理程序中的指令的改寫。具體的,從S601確定的偏移位置開始,以4字節(jié)為單位,讀取待處理程序中的每一條指令,并判斷所有的間接跳轉(zhuǎn)指令是否均已改寫完畢,若是,則結(jié)束流程,若否,則執(zhí)行下述S603。S603:判斷當前指令是否為jr指令,若是,則執(zhí)行S604,若否,則執(zhí)行S606。S604:判斷當前指令的目標寄存器regN是否為R0,若是,則返回執(zhí)行S602,若否,則執(zhí)行S605。S605:將該地址上的jrregN改寫為成jStubN,并寫入上述elf文件中的對應位置,返回執(zhí)行S602。S606:判斷當前指令是否為jalr指令且其目標寄存器regN是否為R0,若是,執(zhí)行S607,若否,則返回執(zhí)行S602。S607:將該地址上的jalrregN改寫為成jalStubN,并寫入上述elf文件中的對應位置,返回執(zhí)行S602。S608:所有過程結(jié)束,關(guān)閉elf文件。待處理器執(zhí)行完上述S601至S608之后,整個待處理程序就改寫完成,獲得改寫后的新版本程序。處理器在執(zhí)行該改寫后的新版本程序時,就可以按照上述實施例一至實施例六的過程執(zhí)行。為了更好的說明處理器執(zhí)行上述改寫后的新版本程序,通過改寫后的新版本程序中的第一跳板代碼和第二跳板代碼避免PC值取指錯誤,本發(fā)明提供了一實施例七,該實施例七具體是以一個程序重寫的完整過程來說明第一跳板代碼和第二跳板代碼是如何避免PC值取指錯誤的,具體的:假設待處理程序中包括第一間接跳轉(zhuǎn)指令jrreg1,第二間接跳轉(zhuǎn)指令jrregN。在執(zhí)行第一間接跳轉(zhuǎn)指令和第二間接跳轉(zhuǎn)指令之前,CPU不知道該條第一跳轉(zhuǎn)指令跳轉(zhuǎn)到哪一個目標地址上,也不知道第二跳轉(zhuǎn)指令跳轉(zhuǎn)到哪一個目標地址上。因此,在程序執(zhí)行過程中,CPU會猜測一個位于R1寄存器內(nèi)(reg1)的第一PC值和位于RN寄存器中的第二PC值,該第一PC值即就是該第一間接跳轉(zhuǎn)指令要跳轉(zhuǎn)到的目標地址,第二PC值即就是第二間接跳轉(zhuǎn)指令要跳轉(zhuǎn)到的目標地址。上述jrreg1指的是要跳轉(zhuǎn)到目標寄存器reg1中的某個地址中去,該某個地址就是第一PC值;上述jrregN指的是要跳轉(zhuǎn)到目標寄存器regN中的某個地址中去,該某個地址就是第二PC值。首先,本實施例中的方法是對R1寄存器構(gòu)造一個第一跳板代碼,對RN寄存器構(gòu)造一個第二跳板代碼,該第一跳板代碼可以為一個或多個,第二跳板代碼可以為一個或多個,依待處理程序中的第一間接跳轉(zhuǎn)指令和第二間接跳轉(zhuǎn)指令的個數(shù)而定。然后,處理器根據(jù)R1寄存器和RN寄存器的編號生成一個跳板代碼段。假設該RN寄存器包括R2-R31總共30個第一寄存器,處理 器按照R1寄存器、R2-R31共31個寄存器的編號將第一跳板代碼和第二跳板代碼進行排序,即第一跳板代碼在前,R2對應的第二跳板代碼隨后,R3對應的第二跳板代碼次后,以此類推,直至排列到R31對應的第二跳板代碼,從而形成跳板代碼段。之后,處理器將所形成的代碼段添加至待處理程序的地址空間的起始位置,獲得新版本程序和映射表。其中,映射表包括所述第一跳板代碼在所述新版本程序中的地址與所述R1寄存器的對應關(guān)系,以及,所述第二跳板代碼在所述新版本程序中的地址與所述第一寄存器的對應關(guān)系,具體可以參見表3所示,具體為:表3地址代碼內(nèi)容baseStubR1,處理jr/jalrr1base+80StubR2,處理jr/jalrv0base+100StubR3,處理jr/jalrv1base+120StubR4,處理jr/jalra0base+140StubR5,處理jr/jalra1base+160StubR6,處理jr/jalra2base+180StubR7,處理jr/jalra3base+200StubR8,處理jr/jalrt0base+220StubR9,處理jr/jalrt1base+240StubR10,處理jr/jalrt2base+260StubR11,處理jr/jalrt3base+280StubR12,處理jr/jalrt4base+300StubR13,處理jr/jalrt5base+320StubR14,處理jr/jalrt6base+340StubR15,處理jr/jalrt7base+240StubR16,處理jr/jalrs0base+260StubR17,處理jr/jalrs1base+280StubR18,處理jr/jalrs2base+300StubR19,處理jr/jalrs3base+320StubR20,處理jr/jalrs4base+340StubR21,處理jr/jalrs5base+360StubR22,處理jr/jalrs6base+380StubR23,處理jr/jalrs7base+400StubR24,處理jr/jalrk0base+420StubR25,處理jr/jalrk1base+440StubR26,處理jr/jalrt8base+460StubR27,處理jr/jalrt9base+480StubR28,處理jr/jalrgpbase+500StubR29,處理jr/jalrspbase+520StubR30,處理jr/jalrfpbase+540StubR31,處理jr/jalrra表3中,v0對應的是R2寄存器,v1對應的R3寄存器,a0對應的是R4寄存器,a1對應的是R5寄存器,a2對應的是R6寄存器,a3對應的是R7寄存器,t0對應的是R8寄存器,t1對應的是R9寄存器,t2對應的是R10寄存器,t3對應的是R11寄存器,t4對應的是R12寄存器,t5對應的是R13寄存器,t6對應的是R14寄存器,t7對應的是R15寄存器,s0對應的是R16寄存器,s1對應的是R17寄存器,s2對應的是R18寄存器,s3對應的是R19寄存器,s4對應的是R20寄存器,s5對應的是R21寄存器,s6對應的是R22寄存器,s7對應的是R23寄存器,k0對應的是R24寄存器,k1對應的是R25寄存器,t8對應的是R26寄存器,t9對應的是R27寄存器,gp對應的是R28寄存器,sp對應的是R29寄存器,fp對應的是R30寄存器,ra對應的是R31寄存器。表3中,StubR1為第一跳板代碼在新版本程序中的地址,StubR2-StubR31分別為不同的第二跳板代碼在新版本程序中的地址。跳板代碼段可以通過對鏈接器(指的是一種軟件鏈接工具)指定鏈接地址的方式放置在待處理程序的代碼空間的起始位置(base),生成新版本程序。之后,對所形成的新版本程序進行改寫,修改每一條jrreg1指令中的reg1為StubR1,修改每一條jalrreg1指令中的reg1為StubR1,從而將每一條jrreg1指令修改為jStubR1以及將每一條jalrreg1指令修改為jalStubR1指令,另外,也要修改每一條jrregN指令中的regN為StubRN,修改每一條jalrregN指令中的regN為StubRN,從而將每一條jrregN修改為jStubRN以及將每一條jalrregN指令修改為jalStubRN指令,進而獲得改寫后的新版本程序。這樣,當處理器執(zhí)行待處理程序時,實際上是執(zhí)行新版本程序。該新版 本程序包括第三間接跳轉(zhuǎn)指令、第四間接指令、第一跳板代碼、第二跳板代碼以及其他指令。實際上,待處理程序中,第一間接跳轉(zhuǎn)指令和第三間接跳轉(zhuǎn)指令的目標寄存器均為R1寄存器,第二間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令的目標寄存器均為第一寄存器。對于所形成的新版本程序,第一跳板代碼中jrreg1或jalrreg1為第一間接跳轉(zhuǎn)指令,位于第一跳板代碼之外的jrreg1或jalrreg1為第三間接跳轉(zhuǎn)指令,第一間接跳轉(zhuǎn)指令和第三間接跳轉(zhuǎn)指令的指令內(nèi)容是相同的;并且,第二跳板代碼中jrregN或jalrregN為第二間接跳轉(zhuǎn)指令,位于第二跳板代碼之外的jrregN或jalrregN為第四間接跳轉(zhuǎn)指令,第二間接跳轉(zhuǎn)指令和第四間接跳轉(zhuǎn)指令的指令內(nèi)容是相同的。從程度的執(zhí)行原理來說,對于新版本程序中的第三間接跳轉(zhuǎn)指令來說,jrreg1為例,當處理器執(zhí)行到改寫后的新版本程序中的jrreg1所在的地址時,因為改寫的原因,此時的jrreg1被改寫為jStubR1,因此,處理器就可以跳轉(zhuǎn)到stubR1(該stubR1為第一跳板代碼在新版本程序中的地址)上去執(zhí)行,即執(zhí)行第一跳板代碼,由于第一跳板代碼中包括多條ssnop指令,因此,其在執(zhí)行完一條或者多條ssnop指令后,就會獲知之前處理器猜測的第一PC值是否正確。如果在執(zhí)行ssnop指令后,處理器確認之前猜測的第一PC值是正確,那么,處理器會繼續(xù)執(zhí)行第一跳板代碼中的jrreg1(參見表1所示),這樣確保了原來的jrreg1指令不會被遺漏掉;如果在執(zhí)行ssnop指令之后,處理器確認第一PC值是錯誤的,會回退到第一跳板代碼在所述新版本程序中的地址上,即回退到stubR1中,此時這個stubR1中的jrreg1里面的第一PC值是正確的,所以處理器會依次執(zhí)行stubR1中的第一跳板代碼。由這里可以看出,這樣子可以避免處理器在猜測第一PC值后直接在所猜測的第一PC值上發(fā)出取指操作。對于新版本程序中的第四間接跳轉(zhuǎn)指令來說,jrregN為例,當處理器執(zhí)行到改寫后的新版本程序中的jrregN所在的地址時,因為改寫的原因,此時的jrregN被改寫為jStubRN,因此,處理器就可以跳轉(zhuǎn)到StubRN(該StubRN為第二跳板代碼在新版本程序中的地址)上去執(zhí)行,即執(zhí)行第二跳板代碼,由于第二跳板代碼中包括用于將所述R1寄存器中的立即數(shù)0xDFFF,FFFF與所述第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間進行按位與的指令,例 如表2中“l(fā)ui$at,0xdfffori$at,$at,0xffff”,因此,處理器在執(zhí)行完該指令后,會將第二PC值約束在Kseg0內(nèi),因此處理器就可以繼續(xù)執(zhí)行第二跳板代碼中的第二間接跳轉(zhuǎn)指令,相當于經(jīng)過一個第二PC值的取指空間約束之后,再重新執(zhí)行第四間接跳轉(zhuǎn)指令。這樣的過程可以確保第二PC值的正確,也確保處理器不會造成第四間接跳轉(zhuǎn)指令的執(zhí)行缺漏。另外,上述實施例中涉及的jr指令、jalr指令、j指令和jal指令,可以參見現(xiàn)有技術(shù)的描述,在此不再贅述。本發(fā)明提供的程序的重寫方法,通過為第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建第一跳板代碼以及為第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建第二跳板代碼,獲得跳板代碼段后將其添加至待處理程序的起始地址空間,獲得新版本程序以及映射表,并根據(jù)該映射表將新版本程序中第三間接跳轉(zhuǎn)指令的目標寄存器修改為第一跳板代碼在新版本程序中的地址,并將新版本程序中第四間接跳轉(zhuǎn)指令的目標寄存器修改為第二跳板代碼在新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到第三間接跳轉(zhuǎn)指令時跳轉(zhuǎn)執(zhí)行第一跳板代碼,以及,在處理器執(zhí)行到第四間接跳轉(zhuǎn)指令時跳轉(zhuǎn)執(zhí)行第二跳板代碼。由于該第一跳板代碼可以確定第一PC值是否正確,第二跳板代碼可以將所猜測的第二PC值約束在Kseg0內(nèi),因此避免了處理器在錯誤的PC上進行取指帶來的程序終止或死機的技術(shù)問題,提高了處理器的執(zhí)行效率。本領域普通技術(shù)人員可以理解:實現(xiàn)上述各方法實施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成。前述的程序可以存儲于一計算機可讀取存儲介質(zhì)中。該程序在執(zhí)行時,執(zhí)行包括上述各方法實施例的步驟;而前述的存儲介質(zhì)包括:ROM、RAM、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。圖7為本發(fā)明提供的程序的重寫裝置實施例一的結(jié)構(gòu)示意圖。該裝置可以集成在計算機中,還可以集成在計算機的處理器中,該裝置也可以為獨立的計算機。如圖7所示,該裝置包括:跳板代碼構(gòu)建模塊10、第一獲取模塊11和第二獲取模塊12。其中,跳板代碼構(gòu)建模塊10,用于為待處理程序中的間接跳轉(zhuǎn)指令的目標寄存器構(gòu)建跳板代碼,獲得跳板代碼段,所述跳板代碼用于將所述間接跳 轉(zhuǎn)指令對應的程序計數(shù)器PC值約束在Kseg0內(nèi);第一獲取模塊11,用于將所述跳板代碼構(gòu)建獲取模塊所獲得的跳板代碼段添加至所述待處理程序的地址空間的起始位置,獲得新版本程序和映射表;其中,所述映射表包括所述跳板代碼在所述新版本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系;第二獲取模塊12,用于根據(jù)所述第一獲取模塊11獲得的所述映射表,將所述新版本程序中位于所述跳板代碼之外的間接跳轉(zhuǎn)指令的目標寄存器修改為所述跳板代碼在所述新版本程序中的地址,獲得改寫后的新版本程序,以使處理器在執(zhí)行到所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述跳板代碼。本發(fā)明提供的程序的重寫裝置,可以執(zhí)行上述方法實施例,其工作原理和技術(shù)效果類似,在此不再贅述。進一步地,所述跳板代碼包括第一跳板代碼和/或第二跳板代碼,所述間接跳轉(zhuǎn)指令包括第一間接指令和/或第二間接跳轉(zhuǎn)指令,所述第一間接跳轉(zhuǎn)指令對應的目標寄存器為R1寄存器,所述第二間接跳轉(zhuǎn)指令對應的目標寄存器為第一寄存器;則所述跳板代碼構(gòu)建模塊10,具體用于為所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建所述第一跳板代碼,獲得所述跳板代碼段;或者,所述跳板代碼構(gòu)建模塊10,具體用于為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,獲得所述跳板代碼段;或者,所述跳板代碼構(gòu)建模塊10,具體用于為所述第一間接跳轉(zhuǎn)指令對應的R1寄存器構(gòu)建所述第一跳板代碼,以及,為所述第二間接跳轉(zhuǎn)指令對應的第一寄存器構(gòu)建所述第二跳板代碼,并根據(jù)所述第一跳板代碼和所述第二跳板代碼,獲得所述跳板代碼段;其中,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi);所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi)。更進一步地,所述跳板代碼構(gòu)建模塊10,具體用于根據(jù)所述第一跳板代碼和所述第二跳板代碼,獲得所述跳板代碼段,具體為:所述跳板代碼構(gòu)建模塊10,具體用于將所述第一跳板代碼和所述第二跳 板代碼按照所對應的寄存器編號從小到大排列,獲得所述跳板代碼段。更進一步地,所述映射表包括所述跳板代碼在所述新版本程序中的地址與所述間接跳轉(zhuǎn)指令的目標寄存器之間的映射關(guān)系,具體為:所述映射表包括所述第一跳板代碼在所述新版本程序中的地址與所述R1寄存器的對應關(guān)系,和/或,所述第二跳板代碼在所述新版本程序中的地址與所述第一寄存器的對應關(guān)系。更進一步地,所述位于所述跳板代碼之外的間接跳轉(zhuǎn)指令包括:位于所述第一跳板代碼之外的第三間接跳轉(zhuǎn)指令,和/或,位于所述第二跳板代碼之外的第四間接跳轉(zhuǎn)指令;其中,所述第三間接跳轉(zhuǎn)指令與所述第一間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第三間接跳轉(zhuǎn)指令的目標寄存器為R1寄存器,所述第四間接跳轉(zhuǎn)指令與所述第二間接跳轉(zhuǎn)指令的指令內(nèi)容相同,且所述第四間接跳轉(zhuǎn)指令的目標寄存器為第一寄存器;則所述第二獲取模塊12,具體用于根據(jù)所述第一獲取模塊11獲得的所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼;或者,所述第二獲取模塊12,具體用于根據(jù)所述第一獲取模塊11獲得的所述映射表,將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼;或者,所述第二獲取模塊12,具體用于根據(jù)所述第一獲取模塊11獲得的所述映射表,將所述新版本程序中所述第三間接跳轉(zhuǎn)指令的目標寄存器修改為所述第一跳板代碼在所述新版本程序中的地址,并將所述新版本程序中所述第四間接跳轉(zhuǎn)指令的目標寄存器修改為所述第二跳板代碼在所述新版本程序中的地址,獲得所述改寫后的新版本程序,以使處理器在執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第一跳板代碼,以及,在所述處理器執(zhí)行到所述第四間接跳轉(zhuǎn)指令所在的地址時跳轉(zhuǎn)執(zhí)行所述第二跳板代碼。所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi),具體為:所述第一跳板代碼,用于確定所猜測的所述第一PC值是否正確,以將所述第一PC值約束在Kseg0內(nèi)。圖8為本發(fā)明提供的程序的重寫裝置實施例二的結(jié)構(gòu)示意圖。在本實施例中,所述第一跳板代碼用于將所述第一間接跳轉(zhuǎn)指令對應的位于所述R1寄存器中的第一PC值約束在Kseg0內(nèi),具體為:所述第一跳板代碼,用于確定所猜測的所述第一PC值是否正確,以將所述第一PC值約束在Kseg0內(nèi)。更具體的,所述第一跳板代碼包括至少一條空指令和所述第一間接跳轉(zhuǎn)指令;所述空指令用于確定所猜測的第一PC值是否正確。故,在上述圖7所示實施例的基礎上,進一步地,上述裝置還可以包括:處理模塊13和判斷執(zhí)行模塊14。處理模塊13,用于執(zhí)行所述改寫后的新版本程序,并當執(zhí)行到所述第三間接跳轉(zhuǎn)指令所在的地址時,跳轉(zhuǎn)執(zhí)行所述第一跳板代碼;判斷執(zhí)行模塊14,用于在執(zhí)行所述空指令后確定所猜測的第一PC值正確時,指示所述處理模塊13繼續(xù)執(zhí)行所述第一跳板代碼中的所述第一間接跳轉(zhuǎn)指令;并用于在執(zhí)行所述空指令后確定所猜測的第一PC值錯誤時,指示所述處理模塊13回退至所述第一跳板代碼在所述新版本程序中的地址上,以重新執(zhí)行所述第一跳板代碼。本發(fā)明提供的程序的重寫裝置,可以執(zhí)行上述方法實施例,其工作原理和技術(shù)效果類似,在此不再贅述。進一步地,所述第二跳板代碼包括按位與指令和第二間接跳轉(zhuǎn)指令;所述第二跳板代碼用于將所述第二間接跳轉(zhuǎn)指令對應的位于所述第一寄存器中的第二PC值約束在Kseg0內(nèi),具體為:所述按位與指令,用于將所述R1寄存器中的立即數(shù)0xDFFF,FFFF與所述第二間接跳轉(zhuǎn)指令對應的第一寄存器的地址空間進行按位與,以將所述第二PC值約束在Kseg0內(nèi)。更進一步地,所述第一間接跳轉(zhuǎn)指令為jrreg1或jalrreg1,所述第二間接跳轉(zhuǎn)指令為jrregN或jalrregN,所述N為大于1小于等于31的正整數(shù),所述第一跳板代碼在所述新版本程序中的地址為StubR1,所述第二跳板代碼在所述新版本程序中的地址為StubRN;當所述第一寄存器為RN時,所述第二跳 板代碼中的第二間接跳轉(zhuǎn)指令為jrregN或jalrregN;則所述第二獲取模塊12,具體用于根據(jù)所述映射表,將所述新版本程序中第三間接跳轉(zhuǎn)指令jrreg1中的reg1修改為StubR1,或者,將jalrreg1中的reg1修改為StubR1;以及,具體用于將所述新版本程序中第四間接跳轉(zhuǎn)指令jrregN中的regN修改為StubRN,或者,將jalrregN中的regN修改為StubRN。本發(fā)明提供的程序的重寫裝置,可以執(zhí)行上述方法實施例,其工作原理和技術(shù)效果類似,在此不再贅述。最后應說明的是:以上各實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述各實施例對本發(fā)明進行了詳細的說明,本領域的普通技術(shù)人員應當理解:其依然可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分或者全部技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的范圍。當前第1頁1 2 3