欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

實現(xiàn)多重返回位置的方法和裝置的制作方法

文檔序號:6414666閱讀:209來源:國知局
專利名稱:實現(xiàn)多重返回位置的方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明一般涉及一種方法及裝置,用來實現(xiàn)一個函數(shù)調(diào)用的多個返回點。尤其是,本發(fā)明涉及有效地獲取多重返回點的地址的方法及裝置。
計算機系統(tǒng)通常是通過計算機系統(tǒng)的網(wǎng)絡(luò)例如局域網(wǎng)、內(nèi)部網(wǎng)(intranets)及國際互聯(lián)網(wǎng)聯(lián)在一起的,使得它們可以共享諸如軟件或程序及代碼之類的資源。另外,包括多個子程序的許多程序被編制為一種程序,在這種程序中調(diào)用了許多并不包括在該程序之內(nèi)的“外部”函數(shù)。通常,這些函數(shù)可被許多子程序所共享,因而允許計算機的系統(tǒng)資源得到更有效的使用。
當(dāng)子程序調(diào)用函數(shù)時,被調(diào)用的函數(shù)必須最終返回到該子程序。另外,對子程序的返回必須要傳到該子程序內(nèi)的正確位置。參見

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