專利名稱:實(shí)現(xiàn)多重返回位置的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及一種方法及裝置,用來(lái)實(shí)現(xiàn)一個(gè)函數(shù)調(diào)用的多個(gè)返回點(diǎn)。尤其是,本發(fā)明涉及有效地獲取多重返回點(diǎn)的地址的方法及裝置。
計(jì)算機(jī)系統(tǒng)通常是通過(guò)計(jì)算機(jī)系統(tǒng)的網(wǎng)絡(luò)例如局域網(wǎng)、內(nèi)部網(wǎng)(intranets)及國(guó)際互聯(lián)網(wǎng)聯(lián)在一起的,使得它們可以共享諸如軟件或程序及代碼之類的資源。另外,包括多個(gè)子程序的許多程序被編制為一種程序,在這種程序中調(diào)用了許多并不包括在該程序之內(nèi)的“外部”函數(shù)。通常,這些函數(shù)可被許多子程序所共享,因而允許計(jì)算機(jī)的系統(tǒng)資源得到更有效的使用。
當(dāng)子程序調(diào)用函數(shù)時(shí),被調(diào)用的函數(shù)必須最終返回到該子程序。另外,對(duì)子程序的返回必須要傳到該子程序內(nèi)的正確位置。參見(jiàn)
圖1,以下將說(shuō)明在計(jì)算機(jī)程序及由該程序調(diào)用的函數(shù)之間的流程。計(jì)算機(jī)代碼104包括一個(gè)子程序g()108。子程序g()108包括多個(gè)被執(zhí)行的指令。如圖所示,所述指令包括對(duì)函數(shù)f()116的反復(fù)調(diào)用112。
當(dāng)函數(shù)f()116被調(diào)用并“正常”執(zhí)行,例如未發(fā)生意外時(shí),則函數(shù)f()116正常地完成其運(yùn)行,并被返回到子程序g()108a計(jì)算機(jī)子程序。函數(shù)f()116返回子程序g()108a內(nèi)的位置依賴于調(diào)用的位置,或子程序g()108a計(jì)算機(jī)子程序內(nèi)調(diào)用函數(shù)f()116的位置。特別是,如果是作為調(diào)用112a的結(jié)果而執(zhí)行函數(shù)f()116,則函數(shù)f()116返回到返回地址120,該地址正如本領(lǐng)域技術(shù)人員可以理解的那樣,是在子程序g()108a計(jì)算機(jī)子程序內(nèi)緊接在調(diào)用112a之后的位置。與此類似,如果函數(shù)f()116是在由調(diào)用112b調(diào)用時(shí)而執(zhí)行的,則函數(shù)f()116返回到返回地址120。一旦函數(shù)f()116返回到子程序g()108a計(jì)算機(jī)子程序,則子程序g()108a一般都繼續(xù)運(yùn)行。
許多函數(shù)可以具有多于一個(gè)的返回位置或點(diǎn)。舉個(gè)例子,一個(gè)函數(shù)除具有一個(gè)正常的或預(yù)期的返回點(diǎn),還具有一個(gè)備用返回點(diǎn)。備用返回點(diǎn)通常被認(rèn)為是“異?!钡姆祷攸c(diǎn),例如與發(fā)生異常情況相關(guān)的返回點(diǎn)。備用返回點(diǎn)一般被存儲(chǔ)在,或被編制在一個(gè)整體程序之內(nèi),以便能根據(jù)需要容易地確定所述返回點(diǎn)。舉一個(gè)例子,在由不是處理異常情況的函數(shù)處理所發(fā)生的異常情況時(shí),程序需要備用返回點(diǎn)。
用于將多個(gè)函數(shù)與多個(gè)備用返回點(diǎn)聯(lián)系在一起的一種機(jī)制是返回點(diǎn)或返回地址表。圖2a是一個(gè)顯示了與調(diào)用棧相關(guān)的返回點(diǎn)表的示意圖。一個(gè)調(diào)用棧204包括一個(gè)調(diào)用程序幀(caller frame)208,該調(diào)用程序幀208調(diào)用另一幀,即被調(diào)用程序幀(callee frame)212。被調(diào)用程序幀212與函數(shù)f()214相關(guān)。因此,當(dāng)調(diào)用程序208調(diào)用被調(diào)用程序幀212時(shí),函數(shù)f()214開(kāi)始運(yùn)行。
在執(zhí)行到函數(shù)f()214的末尾時(shí),函數(shù)f()214返回到,并由此被調(diào)用程序幀212也返回到調(diào)用程序208。當(dāng)?shù)秸{(diào)用程序208的這種返回不是正常的返回時(shí),則正常的返回地址可被當(dāng)作進(jìn)入返回點(diǎn)表220的索引216,以確定正確的備用返回點(diǎn)。例如,如果正常返回地址為“1234”,則可在返回點(diǎn)表220中查詢以找到“1234”。一旦找到“1234”,則可得到與“1234”相關(guān)的備用返回點(diǎn)地址。如圖所示,對(duì)于正常返回地址“1234”,其相應(yīng)的備用返回點(diǎn)地址為“1256”。一旦得到所述的備用返回點(diǎn)地址,則將其用來(lái)確保被調(diào)用程序幀212能恰當(dāng)?shù)胤祷卣{(diào)用程序208。
雖然使用一般作為查詢表或散列表的返回點(diǎn)表,對(duì)于確定用于被調(diào)用程序的一個(gè)合適的返回點(diǎn)是很有效的,但完成表的查詢通常是很慢的。一種用于實(shí)現(xiàn)多重返回點(diǎn)的更快速的處理包括省去對(duì)表的查詢而確定多個(gè)返回點(diǎn)。正如本領(lǐng)域技術(shù)人員所能理解的那樣,在函數(shù)運(yùn)行期間,對(duì)該函數(shù)基本上“知道”這個(gè)函數(shù)是應(yīng)使用一個(gè)常規(guī)的返回,或是這個(gè)函數(shù)應(yīng)使用一個(gè)備用返回。因此,可以存儲(chǔ)與備用返回地址有關(guān)的數(shù)據(jù)。
圖2b是表示了用來(lái)存儲(chǔ)備用返回地址數(shù)據(jù)的子程序的示意圖。子程序g()236包括對(duì)函數(shù)f()的一個(gè)調(diào)用238。不管對(duì)函數(shù)f()的調(diào)用238是否會(huì)導(dǎo)致需要返回備用地址,調(diào)用238通常都會(huì)返回到返回地址240。返回地址240識(shí)別所存儲(chǔ)的備用返回地址數(shù)據(jù)242。所存儲(chǔ)的備用返回地址數(shù)據(jù)242位于子程序g()236a計(jì)算機(jī)子程序內(nèi)靠近調(diào)用238的地方,以使備用返回地址數(shù)據(jù)242能很容易地被訪問(wèn)。一般來(lái)說(shuō),備用返回地址數(shù)據(jù)242存儲(chǔ)在該指令流自身之內(nèi)。由于所存儲(chǔ)的備用返回地址數(shù)據(jù)242有可能不代表一條合法指令,或可能具有不希望有的負(fù)面效應(yīng)例如覆蓋了寄存器內(nèi)的或存儲(chǔ)器單元內(nèi)的一個(gè)值,所以子程序g()的執(zhí)行有可能不在地址240處繼續(xù),而是必須在下一條指令244處繼續(xù)。
當(dāng)調(diào)用238正常返回時(shí),調(diào)用238應(yīng)返回到下一條指令244處。如圖所示,在子程序g()236之內(nèi),下一條指令244離所存儲(chǔ)的備用返回地址數(shù)據(jù)242偏移了一個(gè)距離D。因此,當(dāng)調(diào)用238正常返回時(shí),調(diào)用238必須返回到由返回地址240的位置加上一個(gè)偏移量D所確定的位置,該位置即為下一條指令244的位置。一般來(lái)說(shuō),由于距離D具有一個(gè)4字節(jié)的值,所以下一條指令244離返回地址240偏移了4個(gè)字節(jié)。
在需要一個(gè)備用返回地址時(shí),訪問(wèn)程序內(nèi)所存儲(chǔ)的備用返回地址要比完成一個(gè)表的查詢更具時(shí)效性,而在不需要備用返回地址時(shí),訪問(wèn)所存儲(chǔ)的備用返回地址的能力常常對(duì)該程序的性能予以負(fù)面的影響。當(dāng)一個(gè)函數(shù)調(diào)用正常返回時(shí),在返回地址的位置上加上一個(gè)偏移量以確定出所要執(zhí)行的后續(xù)指令的位置,這種做法常常是比較慢的,而且會(huì)招致與計(jì)算所述后續(xù)指令位置相關(guān)的性能的惡化。換句話說(shuō),與正常返回有關(guān)的速度可能由于所存儲(chǔ)的備用返回地址的實(shí)現(xiàn)而受到損害。另外,用于產(chǎn)生一個(gè)對(duì)一個(gè)正常返回或最有可能發(fā)生的返回“最佳推測(cè)”估計(jì)的分支推算,有可能由于使用跳轉(zhuǎn)而受到損害,正如本領(lǐng)域技術(shù)人員所理解的那樣。
換句話說(shuō),如下所述,“跳轉(zhuǎn)”是用來(lái)繞過(guò)所存儲(chǔ)的備用地址的。跳轉(zhuǎn)或轉(zhuǎn)移通常是包含在程序或子程序中,以繞過(guò)在某些場(chǎng)合有可能是不需要的代碼片段。例如,如圖2c所示,當(dāng)函數(shù)調(diào)用正常返回時(shí),有可能在子程序中執(zhí)行跳轉(zhuǎn),以使能繞過(guò)所存儲(chǔ)的返回地址。在子程序g()266中,對(duì)函數(shù)f()執(zhí)行一個(gè)調(diào)用268。當(dāng)調(diào)用268正常返回時(shí),返回到由返回地址270所確定的子程序g()266內(nèi)的一個(gè)位置。與返回地址270相應(yīng)的這個(gè)位置是要跳轉(zhuǎn)到位置L的一條指令272,該位置L位于距離指令272有一個(gè)固定偏移F處。因此,當(dāng)調(diào)用268正常返回到返回地址270時(shí),就執(zhí)行一個(gè)到下一條指令274的跳轉(zhuǎn)。這種跳轉(zhuǎn)饒開(kāi)了,或這種轉(zhuǎn)移繞過(guò)了所存儲(chǔ)的備用返回地址數(shù)據(jù)276。
雖然跳轉(zhuǎn)的實(shí)現(xiàn)有可能減小了性能的惡化例如硬件性能的惡化,這種惡化與將返回地址加上一個(gè)偏移量以得到后續(xù)指令的位置相關(guān),但是,這種跳轉(zhuǎn)有可能很慢。必須將一個(gè)附加代碼包括在程序內(nèi),以允許其跳轉(zhuǎn),因此增大了程序的整體大小。
如上所述,對(duì)于函數(shù)調(diào)用實(shí)現(xiàn)多重返回點(diǎn)的傳統(tǒng)方法常常很慢且效率不高,因而,這些多重返回點(diǎn)的實(shí)現(xiàn)可有害地影響與函數(shù)調(diào)用相關(guān)的程序的性能。因此,需要的是一種用于實(shí)現(xiàn)多重返回點(diǎn)的有效的方法及裝置,以便既可有效地發(fā)生正常返回,也可有效地發(fā)生備用返回。
這里公開(kāi)了一種方法及裝置,使實(shí)質(zhì)上能存儲(chǔ)與函數(shù)調(diào)用相關(guān)的一個(gè)備用返回地址,以便可容易地訪問(wèn)該備用返回地址。依據(jù)本發(fā)明的一個(gè)方面,實(shí)現(xiàn)有效地存儲(chǔ)與子程序調(diào)用的一個(gè)函數(shù)相關(guān)的返回地址的一種方法,它包括在子程序執(zhí)行期間,從該子程序內(nèi)調(diào)用函數(shù)。一般來(lái)說(shuō),這個(gè)函數(shù)在該子程序的外部。該函數(shù)一旦被調(diào)用,便開(kāi)始運(yùn)行。最終,該函數(shù)返回到子程序。特別是,函數(shù)會(huì)返回到子程序內(nèi)的一個(gè)位置,這個(gè)位置是由所希望的返回點(diǎn),或正常的返回地址所確定的。與所希望的返回點(diǎn)相應(yīng)的子程序內(nèi)的指令是一條“偽”指令,該指令是以低運(yùn)算開(kāi)銷執(zhí)行的。選出所述偽指令以在不影響正常的程序運(yùn)行的情況下運(yùn)行,即不使用其結(jié)果。換句話說(shuō),偽指令的目的是以合適的方式編碼所述備用返回點(diǎn)或多個(gè)點(diǎn)。
在一個(gè)實(shí)施例中,當(dāng)函數(shù)以期望的方式返回到返回子程序時(shí),在返回到所期望的點(diǎn)之前,函數(shù)的執(zhí)行已經(jīng)結(jié)束了,所述偽指令的執(zhí)行沒(méi)有任何效果。在另一個(gè)實(shí)施例中,當(dāng)函數(shù)確實(shí)返回到備用返回點(diǎn)時(shí),執(zhí)行所述代碼,以訪問(wèn)存儲(chǔ)在正常返回點(diǎn)處的偽指令,且由偽指令所代表的庫(kù)值中計(jì)算出所述備用返回點(diǎn)的地址。
在閱讀了以下詳細(xì)的說(shuō)明及研究了以下附圖中的各幅圖之后,本發(fā)明的這些及其它優(yōu)點(diǎn)將變得顯而易見(jiàn)。
參照聯(lián)系所述附圖進(jìn)行的以下詳細(xì)的說(shuō)明,可更好地理解本發(fā)明。
圖1是一個(gè)表明調(diào)用外部方法的計(jì)算機(jī)代碼的示意圖。
圖2a是表明了一個(gè)調(diào)用棧和一個(gè)相關(guān)返回點(diǎn)表的示意圖。
圖2b是表明了一個(gè)存儲(chǔ)了與對(duì)函數(shù)調(diào)用相關(guān)的備用返回地址的計(jì)算機(jī)子程序的示意圖。
圖2c是表明了一個(gè)計(jì)算機(jī)子程序的示意圖,該計(jì)算機(jī)子程序轉(zhuǎn)移并繞過(guò)一個(gè)所存儲(chǔ)的與對(duì)函數(shù)的調(diào)用相關(guān)的備用返回地址。
圖3a是顯示了依據(jù)本發(fā)明一實(shí)施例的計(jì)算機(jī)子程序的示意圖,該子程序在調(diào)用了一個(gè)函數(shù)之后,執(zhí)行了一條偽指令。
圖3b是顯示了依據(jù)本發(fā)明一實(shí)施例的計(jì)算機(jī)子程序的示意圖,該子程序在調(diào)用一個(gè)函數(shù)之后,執(zhí)行了多條偽指令。
圖3c是顯示了依據(jù)本發(fā)明一實(shí)施例的計(jì)算機(jī)子程序的示意圖,該子程序在調(diào)用了一個(gè)函數(shù)之前,執(zhí)行了一條偽指令。
圖4是顯示了依據(jù)本發(fā)明一個(gè)實(shí)施例的與子程序的執(zhí)行相關(guān)的步驟的處理流程圖,該子程序包括一個(gè)具有很多返回點(diǎn)的函數(shù)調(diào)用。
圖5a是顯示了依據(jù)本發(fā)明一實(shí)施例的一個(gè)正常返回的函數(shù)調(diào)用的示意圖。
圖5b是顯示了依據(jù)本發(fā)明一實(shí)施例的一個(gè)函數(shù)調(diào)用的示意圖,所述函數(shù)調(diào)用會(huì)引起發(fā)生異常及異常返回。
圖6是顯示了適于實(shí)現(xiàn)本發(fā)明的一個(gè)計(jì)算機(jī)系統(tǒng)的示意圖。
圖7是顯示了適于實(shí)現(xiàn)本發(fā)明的一種虛擬裝置的示意圖。
在一個(gè)由計(jì)算機(jī)程序調(diào)用的函數(shù)在將要返回該計(jì)算機(jī)程序時(shí),該函數(shù)可返回到若干返回位置或點(diǎn)中的任意一點(diǎn)。舉個(gè)例子,一個(gè)函數(shù)可正常地或如所期望的那樣返回。另外,函數(shù)也可以其它方式例如異常方式返回。一般必須存儲(chǔ)與異常返回相應(yīng)的異常返回點(diǎn),以便能容易地訪問(wèn)到它。
適應(yīng)從函數(shù)返回到程序內(nèi)不同點(diǎn)的一些實(shí)現(xiàn)在查詢表中存儲(chǔ)了一些用于備用返回位置的地址。對(duì)表進(jìn)行查詢以確定備用返回地址的操作通常都很慢。明確地適應(yīng)從函數(shù)返回到不同位置上的其它實(shí)現(xiàn)存儲(chǔ)與備用返回地址相關(guān)的數(shù)據(jù),該地址靠近對(duì)函數(shù)(并且從該函數(shù)返回)進(jìn)行調(diào)用的位置。明顯涉及存儲(chǔ)一次調(diào)用附近的數(shù)據(jù)的這種實(shí)現(xiàn),通常需要會(huì)導(dǎo)致硬件性能惡化的額外的附加空間開(kāi)銷或是會(huì)對(duì)正常返回有負(fù)面影響。
為實(shí)現(xiàn)來(lái)自函數(shù)調(diào)用的多重返回而不會(huì)引起性能惡化或極大地降低任何返回的效率,與返回相應(yīng)的地址數(shù)據(jù)可包含在基本上執(zhí)行非“有用”操作的一條指令中。即實(shí)質(zhì)上沒(méi)有相關(guān)性且一般以極小的開(kāi)銷例如比執(zhí)行跳轉(zhuǎn)所需的要小的開(kāi)銷而執(zhí)行的一條指令,可被用來(lái)對(duì)備用返回地址編碼?;旧蠜](méi)有相關(guān)性,且通常以極小的開(kāi)銷執(zhí)行的一條指令,一般被看作“偽”指令。這類指令包括,但并不僅限于,一些指令例如一條移動(dòng)指令或一條測(cè)試指令。
一般一條移動(dòng)指令用于將數(shù)據(jù)移入一個(gè)寄存器或堆棧區(qū)。舉個(gè)例子,用來(lái)將一個(gè)常數(shù)移入一個(gè)未使用的寄存器的一條移動(dòng)指令可以具有以下語(yǔ)法mov constant,unused-reg其中“unused-reg”可以是當(dāng)前不包括一個(gè)有用值的任一個(gè)寄存器,且“constant”可包括例如是任一個(gè)備用返回地址的數(shù)據(jù)。一條測(cè)試指令依據(jù)一個(gè)寄存器值設(shè)定處理器的標(biāo)志位,且可具有如下語(yǔ)法tst constant,reg其中“reg”可以是任一寄存器,“constant”可包括與一個(gè)備用返回地址相關(guān)的數(shù)據(jù)。
由于執(zhí)行偽指令一般只需要少量的附加計(jì)算,所以在來(lái)自函數(shù)調(diào)用的返回為正常情況時(shí),執(zhí)行一條偽指令不會(huì)有害地影響到計(jì)算機(jī)系統(tǒng)的總體性能。換句話說(shuō),在不需要備用返回時(shí),執(zhí)行一條偽指令一般不會(huì)影響計(jì)算機(jī)系統(tǒng)的性能。因此,不管返回是正常返回還是備用返回,對(duì)提供給函數(shù)調(diào)用使用的偽指令的執(zhí)行是相對(duì)較快且有效的,其中這種函數(shù)調(diào)用有可能引起備用返回。
一般可將一條偽指令放在程序或子程序內(nèi)的任何地方。舉個(gè)例子,可將一條偽指令放在子程序內(nèi)緊隨對(duì)函數(shù)進(jìn)行調(diào)用的位置。參見(jiàn)圖3a,將會(huì)依據(jù)本發(fā)明的一實(shí)施例,對(duì)子程序內(nèi)位于對(duì)函數(shù)的調(diào)用之后的一條偽指令所包含的內(nèi)容進(jìn)行說(shuō)明。子程序g()304一般包括指令308。對(duì)函數(shù)f()的調(diào)用308a的返回既可是正常的,亦可是異常的。
當(dāng)對(duì)函數(shù)f()的調(diào)用308a返回時(shí),返回到子程序g()304內(nèi)由返回地址310所確定的位置。返回地址310確認(rèn)一條偽指令308b。偽指令308b一般位于離對(duì)函數(shù)f()的調(diào)用308a有一個(gè)固定偏移量例如4個(gè)字節(jié)的位置上。
在一個(gè)實(shí)施例中,當(dāng)對(duì)函數(shù)f()的調(diào)用308a正常返回時(shí),則執(zhí)行偽指令308b而基本上不使用附加開(kāi)銷,這種對(duì)偽指令的執(zhí)行,尤其是在現(xiàn)代超標(biāo)量中央處理單元(CPU)中的執(zhí)行,可在每個(gè)機(jī)器周期內(nèi)運(yùn)行許許多多的獨(dú)立指令,正如本領(lǐng)域技術(shù)人員所能理解的那樣。另外,當(dāng)對(duì)函數(shù)f()的調(diào)用308a返回備用返回點(diǎn)時(shí),它讀取包含偽指令308b的字節(jié),并提取出在偽指令308b內(nèi)被編碼的備用返回地址。接著,所述運(yùn)行返回到這一備用返回點(diǎn),因而完成了該備用返回。
在偽指令308b如上所述基本上不使用附加開(kāi)銷地運(yùn)行之后,接下來(lái),或下一步,執(zhí)行子程序g()304內(nèi)的指令308c。應(yīng)該理解,指令308一般前接和后跟許多其它指令。
在一個(gè)實(shí)施例中,對(duì)函數(shù)的調(diào)用可具有多于一個(gè)的備用的或異常的返回點(diǎn)。例如,一個(gè)對(duì)函數(shù)的調(diào)用可涉及多種可能的意外,正如以下將參照?qǐng)D5a及5b所做的更詳細(xì)的說(shuō)明。當(dāng)有可能有多于一個(gè)異常的返回時(shí),則眾多的偽指令可被包含在靠近函數(shù)調(diào)用的地方,以致每個(gè)異常返回地址都有一條相應(yīng)的偽指令。在單獨(dú)一條偽指令不足以保存寄存器或堆棧區(qū)內(nèi)的所有相關(guān)數(shù)據(jù)的情況下,也可使用若干條偽指令。
圖3b是顯示了依據(jù)本發(fā)明一實(shí)施例,在對(duì)函數(shù)進(jìn)行調(diào)用后,執(zhí)行了若干條偽指令的計(jì)算機(jī)子程序的示意圖。如圖所示,子程序g()324包括指令328??蓪⒅噶?28置于子程序g()324內(nèi)的任何地方。換句話說(shuō),可將指令328置于靠近子程序g()324的起始處、在子程序g()324的中央、或大體上位于子程序g()324的末尾。當(dāng)對(duì)函數(shù)f()的調(diào)用328a返回時(shí),返回到由返回地址330所確定的位置。返回地址330確定了第一偽指令328b。在執(zhí)行了第一偽指令328b后,就執(zhí)行緊隨第一偽指令328b的偽指令。最后,執(zhí)行“第N”條偽指令328c。
每條偽指令例如偽指令328b、328c通常位于離調(diào)用328a有一個(gè)固定偏移量的位置,以便可根據(jù)調(diào)用328a而容易地設(shè)置虛位置。所有偽指令的全部運(yùn)行使用了很少的開(kāi)銷,就如每一條偽指令基本上都不使用附加開(kāi)銷那樣。后來(lái),或接著,在“第N”條偽指令328c執(zhí)行之后執(zhí)行指令328d。
一般來(lái)說(shuō),偽指令不必位于對(duì)具有若干返回位置的函數(shù)的調(diào)用之后,也可將偽指令放在對(duì)具有多個(gè)返回位置的函數(shù)的調(diào)用之前。參見(jiàn)圖3c,將根據(jù)本發(fā)明的一實(shí)施例,說(shuō)明將一個(gè)偽指令插入到對(duì)子程序內(nèi)的函數(shù)的調(diào)用之前的情況。如圖所示,子程序g()344包括對(duì)偽指令348a的調(diào)用,該偽指令348a位于對(duì)函數(shù)f()的調(diào)用248b的前面。偽指令348a位于離對(duì)函數(shù)f()的調(diào)用的一個(gè)固定偏移量的位置。每次偽指令348a位于對(duì)子程序g()344內(nèi)函數(shù)f()的調(diào)用248b之前時(shí),偽指令348a與對(duì)函數(shù)f()的調(diào)用248b具有相同的偏移量。在一個(gè)實(shí)施例中,該偏移量為4個(gè)字節(jié),盡管偏移量很可能有懸殊的變化。當(dāng)對(duì)函數(shù)f()的調(diào)用348b返回時(shí),返回到由返回地址350指定的位置。在所說(shuō)明的實(shí)施例中,由返回地址350確定的位置包括一條指令348a。
接著參見(jiàn)圖4,將依據(jù)本發(fā)明的一個(gè)實(shí)施例,說(shuō)明包含在程序內(nèi)的子程序的運(yùn)行過(guò)程中,與一般地運(yùn)行一個(gè)函數(shù)調(diào)用相關(guān)的步驟。如本技術(shù)領(lǐng)域人員所能理解的那樣,正在執(zhí)行的子程序可最終到達(dá)一個(gè)函數(shù)調(diào)用。在步驟402中,由子程序調(diào)用的函數(shù)開(kāi)始運(yùn)行。在函數(shù)執(zhí)行的過(guò)程中,所產(chǎn)生的條件用來(lái)判斷對(duì)函數(shù)的調(diào)用將會(huì)導(dǎo)致正常返回還是異常的或備用的返回。
當(dāng)被調(diào)用的函數(shù)的執(zhí)行在步驟402處引起正常返回時(shí),則處理流轉(zhuǎn)到步驟404,在步驟404中完成所調(diào)用函數(shù)的運(yùn)行。在所調(diào)用的函數(shù)的執(zhí)行結(jié)束后,在步驟406處,函數(shù)返回到由返回地址即正常返回地址所確定的位置。在所說(shuō)明的實(shí)施例中,由返回地址所確定的位置上包括一條偽指令例如,如圖3a所示的一條偽指令。一般來(lái)說(shuō),偽指令可以是任何一條合適的近似“無(wú)附加開(kāi)銷”的指令,這種指令不用改變與程序的全部運(yùn)行相關(guān)的內(nèi)部狀態(tài)就可嵌入一個(gè)常數(shù)。如上所述,偽指令可包括,但并不僅限于,一條移動(dòng)指令及一條測(cè)試指令。
偽指令在步驟412處執(zhí)行之后,所述子程序繼續(xù)執(zhí)行。一般來(lái)說(shuō),子程序的繼續(xù)執(zhí)行可包括對(duì)各種指令的執(zhí)行,如附加的函數(shù)調(diào)用及返回。當(dāng)如果沒(méi)有余下的指令可供執(zhí)行,則子程序的運(yùn)行就結(jié)束了。
返回到步驟402處執(zhí)行所調(diào)用的函數(shù),當(dāng)所調(diào)用的函數(shù)的執(zhí)行需要備用的即異常的返回時(shí),則處理流由步驟402轉(zhuǎn)到步驟408,步驟408從存儲(chǔ)器內(nèi)調(diào)出備用返回地址。特別是,在一個(gè)實(shí)施例中,從正常返回地址加一個(gè)偏移量的位置上調(diào)出備用返回地址。
一旦加載了備用返回地址,則在步驟410,執(zhí)行從函數(shù)到由備用返回地址所確定的位置的跳轉(zhuǎn)。當(dāng)運(yùn)行返回到備用地址時(shí),偽指令被看作“數(shù)據(jù)”,因此,利用這樣一個(gè)事實(shí),即代表一條指令的位也可被看作一個(gè)二進(jìn)制值。舉個(gè)例子,一個(gè)處理器可對(duì)以下指令編碼MOV#1234,regl其中,將一個(gè)可能是備用返回地址的十六進(jìn)制常數(shù)“1234”作為字節(jié)序列“5B000001234”移入寄存器“regl”。然而,指令編碼在不同的處理器類型之間是不同的,任何編碼可基本上確定指令的所有部分,包括指令類型,例如“移入”、第一操作數(shù)例如常數(shù)“1234”、第二操作數(shù)例如寄存器“regl”。
如上所述,一個(gè)編譯器使一條偽指令包括作為一偽指令的第一操作數(shù)的備用返回地址。因此,利用指令格式的常識(shí),通過(guò)讀取作為一個(gè)整數(shù)值的指令的2至5字節(jié),可得到信息諸如一個(gè)常數(shù)值如一個(gè)備用返回地址之類的信息。
正如本技術(shù)領(lǐng)域人員所能理解的那樣,偽指令形成一種模式,其中指令的一些位是固定的,一些是不定的。固定位一般不可變化,因?yàn)楦淖児潭ㄎ粫?huì)使指令的執(zhí)行非常昂貴,或具有干擾程序正常運(yùn)行的負(fù)面影響。舉個(gè)例子,一些固定位可表明指令類型,例如“移動(dòng)”。指令中的變化位可被用來(lái)對(duì)任意值例如備用返回點(diǎn)的地址編碼,舉個(gè)例子,在偽指令“5B00001234”中,字節(jié)“5B”可以是表明對(duì)寄存器“regl”的一個(gè)移入的固定部分,“00001234”可以是不定部分。一般來(lái)說(shuō),偽指令的可變部分是由許多其指令位的任意組合構(gòu)成的,其指令位包括眾多非連續(xù)的部分,并依賴于所使用的特殊的機(jī)器指令集合。
當(dāng)跳轉(zhuǎn)到備用返回地址后,處理流由步驟410轉(zhuǎn)到步驟413,在步驟413處,執(zhí)行與備用返回地址相關(guān)的代碼。接下來(lái),程序繼續(xù)在步驟414處執(zhí)行,直到運(yùn)行結(jié)束。
多個(gè)返回地址對(duì)于實(shí)現(xiàn)各種程序設(shè)計(jì)語(yǔ)言裝置是有用的。舉個(gè)例子,可用偽指令來(lái)方便子程序的執(zhí)行。這種子程序具有有可能發(fā)生意外的函數(shù)調(diào)用。當(dāng)所調(diào)用的函數(shù)發(fā)生意外時(shí),所述意外一般不受所調(diào)用函數(shù)的控制。更確切地說(shuō),函數(shù)的調(diào)用程序控制了該函數(shù)所發(fā)生的意外。圖5A及5B是顯示了依據(jù)本發(fā)明一實(shí)施例的一個(gè)函數(shù)的示意圖,該函數(shù)或是可正常的返回,或是發(fā)生意外并由此異常返回。一個(gè)子程序g()504包括一個(gè)調(diào)用了函數(shù)f()512的try塊508。子程序g()504進(jìn)一步包括一個(gè)異常處理程序510,該程序510用來(lái)控制,或處理在函數(shù)try508的執(zhí)行中所產(chǎn)生的異?,F(xiàn)象。
如圖5a所示,當(dāng)函數(shù)f()512被調(diào)用,并正常返回時(shí),即函數(shù)f()512沒(méi)有產(chǎn)生意外時(shí),函數(shù)f()512返回到try塊508。特別是函數(shù)f()512返回到try塊508內(nèi)。由正常返回地址516所確定的位置。在所說(shuō)明的實(shí)施例中,如上面參照?qǐng)D3a所做的說(shuō)明那樣,由正常返回地址516所確定的這個(gè)位置處是一條偽指令。
如圖5b所示,當(dāng)函數(shù)f()512的執(zhí)行引起意外發(fā)生時(shí),函數(shù)f()512返回到意外處理程序510。即當(dāng)函數(shù)f()512產(chǎn)生意外時(shí),就返回到由備用返回地址520所確定的位置,該位置標(biāo)識(shí)與意外處理程序510相關(guān)的一條指令。
當(dāng)意外處理程序510處理由函數(shù)f()512所發(fā)生的意外時(shí),函數(shù)f()512最終在try塊508后第一條指令522處繼續(xù)執(zhí)行。在一實(shí)施例中的偽指令是這樣一條指令如一條移動(dòng)指令或一條測(cè)試指令,這種指令可使備用返回地址能存儲(chǔ)在指令流中。
一般可在任意合適的計(jì)算機(jī)系統(tǒng)中實(shí)現(xiàn)本發(fā)明。特別是,可使用任意合適的虛擬裝置來(lái)實(shí)現(xiàn)如上所述的多個(gè)返回點(diǎn),例如所述虛擬裝置是參照?qǐng)D7所說(shuō)明的虛擬裝置。圖6顯示了用于實(shí)現(xiàn)本發(fā)明的一個(gè)典型的通用計(jì)算機(jī)系統(tǒng)。計(jì)算機(jī)系統(tǒng)730包括與存儲(chǔ)器設(shè)備相耦合的任意多個(gè)處理器732(也被稱作中央處理單元,或CPU),其中存儲(chǔ)器設(shè)備包括主存儲(chǔ)器734(一般是只讀存儲(chǔ)器,或ROM)及主存儲(chǔ)器736(一般為隨機(jī)存取存儲(chǔ)器,或RAM)。
可用計(jì)算機(jī)系統(tǒng)730,或更具體地說(shuō)是CPU732來(lái)支持一個(gè)虛擬裝置,如本技術(shù)領(lǐng)域人員所能理解的那樣。以下,將參照?qǐng)D7說(shuō)明在計(jì)算機(jī)系統(tǒng)730上所支持的一個(gè)虛擬裝置的例子。正如本技術(shù)領(lǐng)域中所公知的那樣,在RAM一般被用來(lái)以雙向方式傳遞數(shù)據(jù)及指令時(shí),ROM只能以單向方式向CPU732傳遞數(shù)據(jù)及指令。CPU732一般可包括大量的處理器。兩個(gè)主存儲(chǔ)器734、736都可包括任意合適的計(jì)算機(jī)可讀媒體。一般作為一個(gè)大容量存儲(chǔ)器設(shè)備的從存儲(chǔ)媒體738,也與CPU732雙向耦合,并提供附加的數(shù)據(jù)存儲(chǔ)器容量。大容量存儲(chǔ)器設(shè)備738是一種可被用于存儲(chǔ)程序的計(jì)算機(jī)可讀媒體,該程序包括計(jì)算機(jī)代碼、數(shù)據(jù)或類似數(shù)據(jù)。一般情況下,大容量存儲(chǔ)器設(shè)備738是一種比主存儲(chǔ)器設(shè)備734、736要慢的存儲(chǔ)媒體,例如硬盤(pán)或帶。大容量存儲(chǔ)器設(shè)備738可以是磁帶或紙帶閱讀機(jī)或其它眾所周知的設(shè)備。必須明白,在適當(dāng)?shù)那闆r下,存儲(chǔ)在大容量存儲(chǔ)器設(shè)備738內(nèi)的信息,可作為虛擬存儲(chǔ)器以標(biāo)準(zhǔn)方式被插入以作為RAM736的一部分。一個(gè)特殊的主存儲(chǔ)器設(shè)備734如CD-ROM也可向CPU732單向傳送數(shù)據(jù)。
CPU732也可與一種或多種輸入/輸出設(shè)備740相耦合,這些輸入/輸出設(shè)備740可包括,但并不僅限于一些裝置,例如視頻監(jiān)視器、跟蹤球、鼠標(biāo)、鍵盤(pán)、話筒、觸敏顯示器、轉(zhuǎn)接卡讀取器、磁或紙帶閱讀機(jī)、圖形輸入板、輸入筆、聲音或書(shū)寫(xiě)識(shí)別器,或其它當(dāng)然是眾所周知的輸入設(shè)備如其它計(jì)算機(jī)。最后,CPU732可任意地與計(jì)算機(jī)或遠(yuǎn)程通信網(wǎng)絡(luò)如使用如一般在712處所示的網(wǎng)絡(luò)連接的局域網(wǎng)、互聯(lián)網(wǎng)或一個(gè)內(nèi)部網(wǎng)相耦合。對(duì)于這種網(wǎng)絡(luò)連接,在執(zhí)行如上所述的方法步驟的過(guò)程中可想象CPU732可從網(wǎng)絡(luò)中接收信息,或向該網(wǎng)絡(luò)輸出信息??蓮木W(wǎng)絡(luò)中接收這種經(jīng)常被表示為CPU732執(zhí)行的指令序列的信息,或向其輸出這種信息,例如,是以體現(xiàn)在一個(gè)載波中的一個(gè)計(jì)算機(jī)數(shù)據(jù)信號(hào)的形式傳送的。如上所述的設(shè)備及材料對(duì)計(jì)算機(jī)硬件及軟件技術(shù)領(lǐng)域內(nèi)的人員是眾所周知的。
如在前說(shuō)明,一個(gè)虛擬裝置可在計(jì)算機(jī)系統(tǒng)730上執(zhí)行。圖7是代表了由圖7中的計(jì)算機(jī)系統(tǒng)730所支持的且適合于完成本發(fā)明的一個(gè)虛擬裝置的示意圖。當(dāng)一個(gè)計(jì)算機(jī)程序例如是以由California的Pala Alto的太陽(yáng)(Sun)微系統(tǒng)公司所開(kāi)發(fā)的JavaTM程序設(shè)計(jì)語(yǔ)言所寫(xiě)的計(jì)算機(jī)程序運(yùn)行時(shí),將源代碼810提供給編譯時(shí)環(huán)境805內(nèi)的編譯器820。編譯器820將源代碼810轉(zhuǎn)換為字節(jié)代碼830。一般來(lái)說(shuō),源代碼810是在由軟件開(kāi)發(fā)人創(chuàng)建源代碼830時(shí)被轉(zhuǎn)換為字節(jié)代碼830的。
字節(jié)代碼830一般可被重建、下載、或相反通過(guò)網(wǎng)絡(luò)例如圖6的網(wǎng)絡(luò)712分配,或被存儲(chǔ)在存儲(chǔ)器設(shè)備例如圖6的主存儲(chǔ)器734上。在所說(shuō)明的實(shí)施例中,字節(jié)代碼830是平臺(tái)獨(dú)立的。即字節(jié)代碼830實(shí)際上可以在任何能運(yùn)行一個(gè)合適的虛擬裝置840的計(jì)算機(jī)系統(tǒng)中運(yùn)行。舉個(gè)例子,在JavaTM環(huán)境中,字節(jié)代碼830可以在能運(yùn)行JavaTM虛擬裝置的計(jì)算機(jī)系統(tǒng)中運(yùn)行。
將字節(jié)代碼830提供給包括虛擬裝置840的運(yùn)行時(shí)環(huán)境。一般可通過(guò)使用如圖7的CPU732的一個(gè)處理器執(zhí)行運(yùn)行時(shí)環(huán)境835。虛擬裝置840包括一個(gè)編譯器842、一個(gè)解釋器844、及一個(gè)運(yùn)行時(shí)系統(tǒng)846。一般既可將字節(jié)代碼830提供給編譯器842,也可將其提供給解釋器844。
如上所述,當(dāng)將字節(jié)代碼830提供給編譯器842時(shí),包含在字節(jié)代碼630中的方法被編譯為機(jī)器指令。另一方面,當(dāng)將字節(jié)代碼830提供給解釋器844時(shí),字節(jié)代碼830被一次一個(gè)字節(jié)地讀入解釋器844。由于每個(gè)字節(jié)代碼已被讀入解釋器844中,所以接著解釋器844執(zhí)行由每個(gè)字節(jié)代碼所確定的操作。一般來(lái)說(shuō),解釋器844處理字節(jié)代碼830,并連續(xù)地執(zhí)行與字節(jié)代碼830相關(guān)的操作。
當(dāng)由操作系統(tǒng)860調(diào)用了一種方法時(shí),如果確定了該方法是被當(dāng)作解釋方法而調(diào)用的,則運(yùn)行時(shí)系統(tǒng)846可從解釋器844中得到該方法。另一方面,如果確定了該方法是被當(dāng)作編譯方法而調(diào)用的,則運(yùn)行時(shí)系統(tǒng)846激活編譯器842。之后,編譯器842由字節(jié)代碼830產(chǎn)生出機(jī)器指令,并執(zhí)行該機(jī)器語(yǔ)言指令。一般來(lái)說(shuō),當(dāng)虛擬裝置840結(jié)束時(shí),機(jī)器語(yǔ)言指令被廢棄。
雖然僅說(shuō)明了本發(fā)明的幾個(gè)實(shí)施例,但應(yīng)理解本發(fā)明在未脫離本發(fā)明的主旨及范圍的情況下以許多其它的形式實(shí)現(xiàn)。舉個(gè)例子,雖然本發(fā)明的說(shuō)明一般是依據(jù)有兩個(gè)返回點(diǎn)的情況,但也可在對(duì)具有多于兩個(gè)返回點(diǎn)的函數(shù)進(jìn)行調(diào)用中實(shí)現(xiàn)本發(fā)明。一般來(lái)說(shuō),可將偽指令加在計(jì)算機(jī)子程序中,以用于與所調(diào)用函數(shù)相關(guān)的每個(gè)返回點(diǎn)。
一些機(jī)器指令集合被限制在32位的長(zhǎng)度內(nèi),通常這種長(zhǎng)度對(duì)表示一個(gè)完整的返回地址所需的全32住或64位值編碼是不夠的的,在這種情況下,構(gòu)造直接對(duì)一個(gè)32位或64位值編碼的偽指令是不可能的。然而,本發(fā)明仍可被用來(lái)向備用返回點(diǎn)提供快速訪問(wèn)。用以替換在偽指令中直接對(duì)備用返回地址編碼,可將正常返回點(diǎn)和備用返回點(diǎn)之間的距離編碼。在給出這一距離后,可在正常返回地址上加上這一距離,而容易地得到備用返回點(diǎn)。另外,可使用多個(gè)偽指令對(duì)在偽指令中的地址部分編碼,正如以上參照?qǐng)D3b所做的說(shuō)明那樣。舉個(gè)例子,第一偽指令可包括備用地址的第一個(gè)16位,而第二偽指令可包括32位值所余下的16位。
一般可廣泛地變換與包括函數(shù)的程序的運(yùn)行相關(guān)的步驟,該函數(shù)具有多個(gè)返回點(diǎn)。例如,如上參照?qǐng)D3c所做的說(shuō)明中,與特定的函數(shù)調(diào)用相關(guān)的偽指令可位于函數(shù)調(diào)用之前。換句話說(shuō),可在函數(shù)調(diào)用之前執(zhí)行一偽指令如移動(dòng)指令或測(cè)試指令而未脫離本發(fā)明的主旨及范圍,其中的函數(shù)調(diào)用是與偽指令相關(guān)。
多個(gè)返回點(diǎn)的使用適用于各種不同的用途。如上所述,可使用多個(gè)返回點(diǎn)以減輕發(fā)生意外的困擾。雖然只說(shuō)明了依據(jù)本發(fā)明如何實(shí)現(xiàn)意外的一個(gè)例子,必須理解可廣泛地變換意外的實(shí)現(xiàn),而未脫離本發(fā)明的主旨和范圍。使用多個(gè)返回點(diǎn)可適用于在系統(tǒng)如一個(gè)基于Smalltalk語(yǔ)言的系統(tǒng)中使用,其中的系統(tǒng)使用了非局部返回。當(dāng)使用多重返回點(diǎn)時(shí),可將相關(guān)偽指令放置在對(duì)具有多重返回點(diǎn)的函數(shù)的調(diào)用之后。也可將所述偽指令放在對(duì)函數(shù)的調(diào)用之前。最終,可將多條偽指令分布為一些偽指令位于調(diào)用之前,而其余的則位于調(diào)用之后。因此,應(yīng)將本實(shí)施例看作是說(shuō)明性的且不是對(duì)本發(fā)明的限制。本發(fā)明并不僅限于本文所給出的詳細(xì)情況,還包括許多覆蓋其全部范圍的在附加權(quán)利要求的范圍內(nèi)所做的修改。
權(quán)利要求
1.用于存儲(chǔ)與若干返回點(diǎn)中的一個(gè)點(diǎn)相關(guān)的數(shù)據(jù)的一種計(jì)算機(jī)實(shí)現(xiàn)方法,該方法使能有效地獲得與若干返回點(diǎn)中的該點(diǎn)相關(guān)的數(shù)據(jù),所述若干返回點(diǎn)包括一個(gè)期望的返回點(diǎn)及一個(gè)第一備用返回點(diǎn),該計(jì)算機(jī)實(shí)現(xiàn)方法包括在子程序運(yùn)行時(shí),從子程序內(nèi)部調(diào)用一個(gè)函數(shù),其中函數(shù)是與該子程序分開(kāi)的;開(kāi)始執(zhí)行該函數(shù);從函數(shù)返回到子程序,其中函數(shù)返回到子程序內(nèi)的由期望的返回點(diǎn)所確定的位置;以及執(zhí)行子程序內(nèi)的第一指令,其中對(duì)第一指令的執(zhí)行幾乎沒(méi)有使用附加開(kāi)銷,并且對(duì)該子程序的執(zhí)行沒(méi)有明顯的影響。
2.如權(quán)利要求1所述的一種計(jì)算機(jī)實(shí)現(xiàn)方法,其特征在于所述函數(shù)如所期望的那樣返回到所述子程序,該方法進(jìn)一步包括在返回到所期望的返回點(diǎn)之前,完成對(duì)所述函數(shù)的執(zhí)行,所述所期望的返回點(diǎn)用于識(shí)別該子程序內(nèi)的第一指令。
3.一種如權(quán)利要求2所述的計(jì)算機(jī)實(shí)現(xiàn)方法,進(jìn)一步包括所述子程序的繼續(xù)運(yùn)行。
4.如前述權(quán)利要求之一的一種計(jì)算機(jī)實(shí)現(xiàn)方法,其特征在于開(kāi)始執(zhí)行函數(shù)的步驟包括加載第一備用返回點(diǎn),其中第一備用返回點(diǎn)是由位于距離所期望的返回點(diǎn)有一個(gè)固定偏移量的位置上的一條指令所確定的。
5.如權(quán)利要求4所述的一種計(jì)算機(jī)實(shí)現(xiàn)方法,進(jìn)一步包括中止對(duì)所調(diào)用的函數(shù)的運(yùn)行;以及跳轉(zhuǎn)到第一備用返回點(diǎn)。
6.用于存儲(chǔ)與若干返回點(diǎn)中的一個(gè)點(diǎn)相關(guān)的數(shù)據(jù)的一種計(jì)算機(jī)系統(tǒng),該系統(tǒng)能有效地獲得與若干返回點(diǎn)中的該點(diǎn)相關(guān)的數(shù)據(jù),所述若干返回點(diǎn)包括一個(gè)期望的返回,最及一個(gè)第一備用返回點(diǎn),該計(jì)算機(jī)系統(tǒng)包括一個(gè)處理器;一個(gè)與處理器相關(guān)的調(diào)用裝置,所述調(diào)用裝置用于在子程序運(yùn)行時(shí),從子程序內(nèi)部調(diào)用一個(gè)函數(shù),其中函數(shù)是與該子程序分開(kāi)的;一個(gè)與處理器相關(guān)的執(zhí)行裝置,該執(zhí)行裝置用于開(kāi)始執(zhí)行一個(gè)函數(shù);以及一個(gè)返回裝置,用于從函數(shù)返回到子程序,其中函數(shù)返回到子程序內(nèi)由期望的返回點(diǎn)所確定的位置,其中返回裝置還用于執(zhí)行子程序內(nèi)的第一指令,其中對(duì)第一指令的執(zhí)行幾乎沒(méi)有使用附加開(kāi)銷,并且對(duì)該子程序的執(zhí)行沒(méi)有明顯的影響。
7.如權(quán)利要求6所述的一種計(jì)算機(jī)系統(tǒng),其特征在于將所述函數(shù)設(shè)置為如所期望的那樣返回到所述子程序,所述執(zhí)行裝置還用于在返回到所期望的返回點(diǎn)之前,完成對(duì)所述函數(shù)的執(zhí)行,所述所期望的返回點(diǎn)用于識(shí)別該子程序內(nèi)的第一指令。
8.一種如權(quán)利要求6和7之一所述的計(jì)算機(jī)系統(tǒng),其特征在于所述執(zhí)行裝置進(jìn)一步包括一個(gè)加載器,該加載器用于加載第一備用返回點(diǎn),該第一備用返回點(diǎn)是由位于離所期望的返回點(diǎn)有一個(gè)固定偏移量的位置上的一條指令確定的。
9.用于存儲(chǔ)與若干返回點(diǎn)中的一個(gè)點(diǎn)相關(guān)的數(shù)據(jù)的一種計(jì)算機(jī)程序產(chǎn)品,該系統(tǒng)能有效地獲得與若干返回點(diǎn)中的該點(diǎn)相關(guān)的數(shù)據(jù),所述若干返回點(diǎn)包括一個(gè)期望的返回點(diǎn),該計(jì)算機(jī)程序產(chǎn)品包括用于在子程序運(yùn)行時(shí),從子程序內(nèi)部調(diào)用一個(gè)函數(shù)的計(jì)算機(jī)代碼,其中函數(shù)是與該子程序分開(kāi)的;用于開(kāi)始執(zhí)行一個(gè)函數(shù)的計(jì)算機(jī)代碼;用于從函數(shù)返回到子程序的計(jì)算機(jī)代碼,其中函數(shù)返回到子程序內(nèi)由期望的返回點(diǎn)所確定的位置;用于執(zhí)行子程序內(nèi)的第一指令的計(jì)算機(jī)代碼,其中對(duì)第一指令的執(zhí)行幾乎沒(méi)有使用附加開(kāi)銷,并且對(duì)該子程序的執(zhí)行沒(méi)有明顯的影響;以及一種能存儲(chǔ)該計(jì)算機(jī)代碼的計(jì)算機(jī)可讀媒體。
10.如權(quán)利要求9的一種計(jì)算機(jī)程序產(chǎn)品,其特征在于所述計(jì)算機(jī)可讀媒體是從由數(shù)據(jù)信號(hào)所組成的群中選出的一種,所述數(shù)據(jù)信號(hào)可以是實(shí)現(xiàn)在一載波、一CD-ROM、一計(jì)算機(jī)磁盤(pán)、一計(jì)算機(jī)帶、及一計(jì)算機(jī)磁盤(pán)驅(qū)動(dòng)器內(nèi)的。
11.用于存儲(chǔ)與若干返回點(diǎn)中的一個(gè)點(diǎn)相關(guān)的數(shù)據(jù)的一種計(jì)算機(jī)實(shí)現(xiàn)方法,該方法能有效地獲得與若干返回點(diǎn)中的該點(diǎn)相關(guān)的數(shù)據(jù),所述若干返回點(diǎn)包括一個(gè)期望的返回點(diǎn)及一個(gè)第一備用返回點(diǎn),該計(jì)算機(jī)實(shí)現(xiàn)方法包括執(zhí)行一個(gè)子程序;在子程序運(yùn)行時(shí),從子程序內(nèi)部訪問(wèn)一個(gè)函數(shù),該函數(shù)實(shí)際上是與該子程序分開(kāi)的;啟動(dòng)函數(shù)的運(yùn)行;從函數(shù)返回到子程序,其中函數(shù)返回到子程序內(nèi)由期望的返回點(diǎn)所確定的位置;以及執(zhí)行子程序內(nèi)的第一指令,其中對(duì)第一指令的執(zhí)行對(duì)該子程序的全部執(zhí)行速度沒(méi)有明顯的影響。
12.如權(quán)利要求11的一種計(jì)算機(jī)實(shí)現(xiàn)方法,進(jìn)一步包括確定何時(shí)函數(shù)如所期望的那樣返回到子程序;以及當(dāng)函數(shù)如所期望的那樣返回到子程序時(shí),在返回到所期望的返回點(diǎn)之前,完成對(duì)函數(shù)的運(yùn)行,將所期望的返回點(diǎn)設(shè)置為能識(shí)別子程序內(nèi)的第一指令。
13.如前述權(quán)利要求之一所述的一種計(jì)算機(jī)實(shí)現(xiàn)方法,其特征在于啟動(dòng)函數(shù)的運(yùn)行包括識(shí)別第一備用返回點(diǎn),其中所述第一備用返回點(diǎn)是由離所期望的返回點(diǎn)有一個(gè)固定偏移量的位置上的一條指令所識(shí)別的。
14.如權(quán)利要求13所述的一種計(jì)算機(jī)實(shí)現(xiàn)方法,進(jìn)一步包括中止函數(shù)的運(yùn)行;以及跳轉(zhuǎn)到第一備用返回點(diǎn)。
15.用于運(yùn)行子程序的一種計(jì)算機(jī)實(shí)現(xiàn)方法,所述子程序包括一個(gè)函數(shù)調(diào)用和若干返回點(diǎn),所述計(jì)算機(jī)實(shí)現(xiàn)方法包括開(kāi)始執(zhí)行子程序;啟動(dòng)函數(shù)調(diào)用的運(yùn)行;加載與該子程序相關(guān)的第一返回地址;從函數(shù)調(diào)用返回到第一返回地址;執(zhí)行與第一返回地址相關(guān)的代碼,其中執(zhí)行與第一返回地址相關(guān)的代碼包括將與指令相關(guān)的位翻譯為二進(jìn)制值;以及繼續(xù)執(zhí)行能夠所述子程序。
全文摘要
公開(kāi)了一種基本上能有效存儲(chǔ)與一函數(shù)調(diào)用相關(guān)的備用返回地址,以便可容易地訪問(wèn)該備用返回地址的方法及裝置。依據(jù)本發(fā)明的一個(gè)方面,用于使能有效地存儲(chǔ)與由一子程序調(diào)用的函數(shù)相關(guān)的返回地址的方法。函數(shù)一旦被調(diào)用,就開(kāi)始運(yùn)行。最終,該函數(shù)返回到子程序。相應(yīng)于所期望返回點(diǎn)的子程序內(nèi)的指令是一條偽指令,該偽指令以低附加開(kāi)銷運(yùn)行,且不影響程序運(yùn)行。當(dāng)所調(diào)用的程序返回到備用返回點(diǎn)時(shí),它通過(guò)閱讀嵌入在所述偽指令內(nèi)的數(shù)據(jù)而得到該地址。
文檔編號(hào)G06F9/42GK1234549SQ9812430
公開(kāi)日1999年11月10日 申請(qǐng)日期1998年10月5日 優(yōu)先權(quán)日1997年10月6日
發(fā)明者U·赫爾茨勒, R·格里瑟梅爾 申請(qǐng)人:太陽(yáng)微系統(tǒng)有限公司