一種函數調用方法及裝置與流程
2023-06-20 12:11:16 1

本發明涉及數據處理領域,具體涉及一種函數調用方法及裝置。
背景技術:
在高級語言程序設計中,為了實現函數調用,需要對函數的接口信息進行分析,具體包括參數類型、參數入棧方向、參數傳遞模式等,完成對接口信息的分析後,針對該函數設計相應的調用模塊。
由於不同的函數的接口信息一般不同,所以,現有技術的函數調用方法需要針對每個函數均進行接口信息的分析,並分別設計針對性的調用模塊。由於不同的函數的接口信息不同,所以現有技術中需要分別針對每個函數的接口信息進行分析,另外,不同函數的參數傳遞模式也不同,反映出入棧的形式也不同,可能為了提高效率部分入棧還會採用寄存器,所以現有技術中還需要對不同函數的上述內容進行分析,分析過程複雜、困難,從而導致對函數的調用效率較低。
技術實現要素:
本發明提供了一種函數調用方法及裝置,能夠自動化的完成函數的調用,提高了函數調用效率。
本發明實施例提供了一種函數調用方法,所述方法包括:
將待調用函數的源文件編譯成二進位文件,所述二進位文件中包括數據段、代碼段和文件頭,所述文件頭用於存儲所述數據段和所述代碼段的位置信息;
將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址;
利用程序指針寄存器建立虛擬棧,並為所述虛擬棧分配內存;
將所述待調用函數的參數,以二進位碼流的形式寫入所述虛擬棧,以便在所述待調用函數運行時從所述虛擬棧中調用所述參數;
通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用。
可選的,所述待調用函數為多個時,所述方法還包括:
將各個待調用函數的二進位文件中的數據段進行拼裝,得到拼裝後數據段;
將各個待調用函數的二進位文件中的代碼段進行拼裝,得到拼裝後代碼段;
獲取拼裝後文件,所述拼裝後文件中包括所述拼裝後數據段、所述拼裝後代碼段和文件頭,所述文件頭存儲有所述拼裝後數據段和所述拼裝後代碼段的位置信息;
相應的,所述將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址,包括:
將所述拼裝後數據段、所述拼裝後代碼段和所述文件頭加載入內存,並記錄內存地址。
可選的,所述為所述虛擬棧分配內存,包括:
利用系統內存分配函數,為所述虛擬棧動態分配內存;
或,
通過靜態連結庫或動態連接庫佔據內存,為所述虛擬棧靜態分配內存。
可選的,所述方法應用於函數測試程序中。
可選的,所述通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用之前,還包括:
內嵌彙編指令或注入二進位指令碼,所述彙編指令和所述二進位指令碼均用於指示先將所述程序指針寄存器的值保存在所述虛擬棧的首地址中,再將所述程序指針寄存器的值修改為所述虛擬棧的首地址+4。
可選的,所述通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用之後,還包括:
當所述待調用函數測試結束後,返回地址寄存器,保存下一條指令的內存地址,從所述虛擬棧的首地址中讀取所述程序指針寄存器的值,並順序從所述程序指針寄存器中恢復現場。
本發明實施例還提供了一種函數調用裝置,所述裝置包括:
編譯模塊,用於將待調用函數的源文件編譯成二進位文件,所述二進位文件中包括數據段、代碼段和文件頭,所述文件頭用於存儲所述數據段和所述代碼段的位置信息;
加載模塊,用於將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址;
建立模塊,用於利用程序指針寄存器建立虛擬棧,並為所述虛擬棧分配內存;
寫入模塊,用於將所述待調用函數的參數,以二進位碼流的形式寫入所述虛擬棧,以便在所述待調用函數運行時從所述虛擬棧中調用所述參數;
調用模塊,用於通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用。
可選的,所述待調用函數為多個時,所述裝置還包括:
第一拼裝模塊,用於將各個待調用函數的二進位文件中的數據段進行拼裝,得到拼裝後數據段;
第二拼裝模塊,用於將各個待調用函數的二進位文件中的代碼段進行拼裝,得到拼裝後代碼段;
獲取模塊,用於獲取拼裝後文件,所述拼裝後文件中包括所述拼裝後數據段、所述拼裝後代碼段和文件頭,所述文件頭存儲有所述拼裝後數據段和所述拼裝後代碼段的位置信息;
相應的,所述加載模塊,具體用於將所述拼裝後數據段、所述拼裝後代碼段和所述文件頭加載入內存,並記錄內存地址。
可選的,所述建立模塊,包括:
第一分配子模塊,用於利用系統內存分配函數,為所述虛擬棧動態分配內存;
或,
第二分配子模塊,用於通過靜態連結庫或動態連接庫佔據內存,為所述虛擬棧靜態分配內存。
可選的,所述裝置應用於函數測試程序中。
可選的,所述裝置還包括:
內嵌或注入模塊,用於內嵌彙編指令或注入二進位指令碼,所述彙編指令和所述二進位指令碼均用於指示先將所述程序指針寄存器的值保存在所述虛擬棧的首地址中,再將所述程序指針寄存器的值修改為所述虛擬棧的首地址+4。
可選的,所述裝置還包括:
處理模塊,用於當所述待調用函數測試結束後,返回地址寄存器,保存下一條指令的內存地址,從所述虛擬棧的首地址中讀取所述程序指針寄存器的值,並順序從所述程序指針寄存器中恢復現場。
由於本發明實施例將函數的源文件編譯成二進位文件,即將高級程序語言編寫的代碼編譯成二進位機器碼進行傳遞,不需要關心函數的應用層含義,對於底層而言均是字節流。所以,本發明實施例提供的是一種通用的函數調用方法,能夠自動化的完成函數的調用,提高了函數調用效率,且不需要操作人員具有計算機編程知識。
附圖說明
為了更清楚地說明本申請實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的一些實施例,對於本領域普通技術人員來講,在不付出創造性勞動性的前提下,還可以根據這些附圖獲得其他的附圖。
圖1為本發明實施例提供的一種函數調用方法流程圖;
圖2為本發明實施例提供的一種函數調用裝置的結構示意圖;
圖3為本發明實施例提供的另一種函數調用裝置的結構示意圖。
具體實施方式
下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例。基於本申請中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬於本申請保護的範圍。
由於現有技術中的函數調用方法是基於軟體應用層的,不同的函數的接口信息不同,所以需要對各個函數的接口信息分別進行分析,才能完成各個函數的調用。
另外,不同函數的參數傳遞模式也不同,反映出入棧的形式也不同,可能為了提高效率部分入棧還會採用寄存器,所以現有技術中還需要對不同函數的上述內容進行分析,分析過程複雜、困難,從而導致對函數的調用效率較低。
而本發明是基於軟體系統底層進行函數調用,不關心軟體應用層的接口信息。由於對於底層而言,不同的函數具備同樣的結構,即使是採用不同的高級語言編寫的函數,底層對其的處理也是一樣的。所以,本發明提供了一種通用的函數調用方法,針對不同的函數,能夠利用通用函數接口自動化的完成函數調用,不需要操作人員針對不同的函數進行分析,提高了函數調用的效率。
具體的,參考圖1,為本發明實施例提供的一種函數調用方法流程圖,所述方法具體可以包括:
s101:將待調用函數的源文件編譯成二進位文件,所述二進位文件中包括數據段、代碼段和文件頭,所述文件頭用於存儲所述數據段和所述代碼段的位置信息。
本發明實施例中,待調用函數可以是採用各種高級程序語言編寫的函數,如採用c語言編寫的函數。
實際應用中,系統在接收到待調用函數後,經由編譯器、彙編器等對該待調用函數的源文件進行編譯,得到二進位文件。該二進位文件中包括該待調用函數的代碼段、數據段和文件頭,其中,文件頭用於存儲數據段和代碼段的位置信息,包括數據段和代碼段的地址、長度等。
一種應用場景中,本發明實施例提供的函數調用方法可以應用於函數測試程序中。具體的,函數測試程序用於對函數進行測試,以通過測試結果確定函數是否能夠正常運行。
在函數測試程序的應用場景中,對函數進行測試時需要調用待測試函數,具體的,利用本發明實施例提供的函數調用方法能夠自動化的實現對函數的調用。
另外,函數測試程序的測試函數可以是一個或多個,針對多個函數同時測試的情況,本發明實施例可以實現對多個函數的同時調用。
具體的,獲取各個待調用函數的二進位文件後,提取各個二進位文件中的代碼段、數據段,並分別對各個二進位文件的代碼段和數據段進行拼裝。例如,代碼段1,代碼段2……代碼段n代表n個二進位文件中的代碼段,本發明實施例將代碼段1,代碼段2……代碼段n拼裝,得到拼裝後的代碼段;具體的,根據系統指令集類型進行代碼段的拼裝,如risc指令集系統,指令結構是按4或8位元組對齊,因此,代碼段可以通過直接拷貝的方式進行拼接,而如cisc體系結構下,指令結構是變長的,因此,需要根據指令集特徵進行拼接。
同樣的,將數據段1,數據段2……數據段n拼裝,得到拼裝後的數據段。由於數據段一般需要對齊,所以在拷貝數據段進行拼裝的過程中需要通過補零的方式進行補齊操作,以保證後續對數據進行尋址的有效性。
另外,將拼裝後的數據段和拼裝後的代碼段組成拼裝後的文件,並生成該拼裝後的文件的文件頭,其中,該文件頭用於存儲拼裝後的數據段和拼裝後的代碼段的位置信息。具體的,位置信息可以包括各個代碼段、數據段的偏移量,以便後續對函數調用時能夠根據初始地址和偏移量進一步確定對應的代碼段和數據段的地址。
由於拼裝後的文件中的代碼段、數據段之間的相對地址發生了變化,因此,本發明實施例還需在該拼裝後的文件的文件頭中存儲各個代碼段和數據段之間的相對地址的變化信息,即各個代碼段和數據段的偏移量,根據代碼段i和與其匹配的數據段i之間的偏移量,對文件頭進行填充。具體步驟如下所述:
步驟一:以代碼段i、數據段i,文件頭i為例,假設代碼段i、數據段i之間的偏移量集合為{offseti1,offseti2,...,offsetij};
步驟二:假設在新的二進位文件中,代碼段i的後續代碼段是由{代碼段i+1,代碼段i+2,...,代碼段n}構成,數據段i的後續數據段是由{數據段i+1,數據段i+2,...,數據段n}構成,而代碼段i、數據段i之間原始偏移量為offseti,那麼其偏移量集合為{offseti1,offseti2,...,offsetij}的基值累加,size(代碼段i+1,代碼段i+2,...,代碼段n)+size(數據段i+1,數據段i+2,...,數據段n),其中size代表段的長度。
步驟三:根據所述進行基值累加後的offseti,對代碼段i內對數據段i進行數據訪問的二進位機器碼進行修改。
s102:將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址。
本發明實施例在獲取二進位文件後,提取其中的數據段、代碼段和文件頭,並將數據段、代碼段和文件頭加載入內存,並記錄內存地址。
對於拼裝後的二進位文件,提取拼裝後的數據段、拼裝後的代碼段和拼裝後的文件頭,並將拼裝後的數據段、拼裝後的代碼段和拼裝後的文件頭加載入內存,並記錄內存地址。
在上述函數測試程序的應用場景中,在函數測試程序執行過程中,可以通過動態修改函數測試程序跳轉地址實現對相應位置的數據訪問。實際應用中,將函數測試程序中預設跳轉指針指向記錄的內存地址,實現對該內存地址對應的數據的訪問。
s103:利用程序指針寄存器建立虛擬棧,並為所述虛擬棧分配內存。
s104:將所述待調用函數的參數,以二進位碼流的形式寫入所述虛擬棧,以便在所述待調用函數運行時從所述虛擬棧中調用所述參數。
本發明實施例中,預先利用程序指針寄存器建立虛擬棧,並為所述虛擬棧分配內存,虛擬棧用於待調用函數的參數傳遞。
由於各個待調用函數的程序本身具有自身維護的棧框架,在函數調用過程中,函數調用程序與待調用函數需要運用同一套棧地址空間。一旦待調用函數出現棧溢出等問題,將影響函數調用主程序的執行,為了避免棧溢出等問題的發生,本發明實施例為待調用函數建立虛擬棧,具體的,可以通過添加額外的數據段,並將待調用函數的棧指針指向該數據段所在區域,從而實現虛擬棧。由於虛擬棧的內存空間不受限制,所以本發明實施例能夠避免棧溢出等問題。
具體的,為虛擬棧分配內存的方式如下:
動態分配:利用系統內存分配函數,如malloc等函數,從堆空間內動態獲取足夠長的內存空間,並將該內存空間的首地址作為虛擬棧的起始地址,完成為虛擬棧的內存分配;
靜態分配:加載佔據一定內存空間的靜態連結庫或動態連結庫至內存,其中的代碼段、數據段均可用於虛擬棧,完成為虛擬棧的內存分配。
實際應用中,在完成對虛擬棧的內存分配後,將該虛擬棧的地址寫入作業系統的程序指針寄存器中,以便在執行函數調用的過程中,系統通過程序指針寄存器中存儲的虛擬棧的地址,對該虛擬棧中的參數進行訪問。具體的,可以採用bytecode技術覆蓋代碼段的方式,實現將虛擬棧的地址寫入作業系統的程序指針寄存器的操作。
其中,採用bytecode技術覆蓋代碼段的方式的一種具體實現步驟可以如下:
步驟一、內嵌彙編指令或注入二進位指令碼,以將a11的值保存在虛擬棧首地址,並將a11的值修改為虛擬棧空間首地址+4,這是為了解決棧地址的保存,其中,a11是一種程序指針寄存器。
步驟二、待調用函數完成調用後,從虛擬棧首地址讀取原始a11的值;
步驟三、返回地址寄存器a12,保存函數調用下一條指令的內存地址;
步驟四、將參數信息,以步驟一所述的方式,直接拷貝至虛擬棧的內存中;
步驟五、調用結束後,順序從a11中恢復現場。
另外,避免對其他程序造成影響,本發明實施例在將該虛擬棧的地址寫入程序指針寄存器之前,預先將程序指針寄存器的當前值保留,待函數調用結束後,對其進行恢復。
實際應用中,待調用函數的參數類型可能包括形參和實參,形參傳值,實參傳地址,但是對於本發明實施例中的虛擬棧而言,形參和實參同是數據,沒有參數類型的區別。本發明實施例提供了如下將待調用函數的參數寫入虛擬棧的方法,以risc體系結構為例,一般採用4位元組對齊,如果採用字節流時,需要按參數進行對齊,具體實現如下:
假設待調用函數存在參數列表{param1,param2,...,.paramn},其參數類型分別為{type1,type2,...,typen}。
本發明實施例中,預先接收用戶設置的二進位碼流的長度,即單次寫入虛擬棧的參數長度。由於採用4位元組對齊,需要在非對齊的部分補齊,即補充「/0」,具體的補齊方式如下:
((sizeof(type1)/4)*4+((sizeof(type1)%4)==0?4:0))+
((sizeof(type2)/4)*4+((sizeof(type2)%4)==0?4:0))+
....+
((sizeof(typen)/4)*4+((sizeof(typen)%4)==0?4:0));
s105:通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用。
在傳統棧結構中,對參數壓棧是按照指定的參數入棧順序,依次將參數壓入堆棧內。從彙編層次來看,與棧相關的彙編指令,根據程序對參數的使用情況,按照生命周期進行離散分布,並擇時出棧。而本發明實施例中,為了屏蔽用戶對函數接口定義的理解,為此,對虛擬棧的壓棧和出棧是一次性完成的。以下提供了一種對虛擬棧的壓棧和出棧的實現方式:
首先,根據用戶設置的二進位碼流的長度,對a11多次累加len,其中len是4位元組對齊的。其次,分析待調用函數中的數據依賴關係,將待調用函數中與出棧相關的指令利用bytecode技術填充為nop指令。
實際應用中,虛擬棧的生成是通過內嵌彙編代碼的方式實現的,具體如下;
步驟一:編寫原始架構代碼,通過編譯器編譯形成彙編語言,以下是sccall函數對test函數的調用:
步驟二:編譯原始架構代碼,生成彙編程序,並記錄test函數相對sccall函數的相對偏移量。
步驟三:添加下述彙編指令01,02,04,其中01用於保存棧指針寄存器a11,02用於設定棧指針,04用於在調用結束後恢復,具體如下:
01pr0stw「虛擬堆棧地址」,a11,.
02pr0movea11,虛擬堆棧地址+4(0-(len)).
03sccall(param);
04pr0ldwa11「虛擬堆棧地址」.
本發明實施例中,在虛擬棧建立完成後,如上述步驟一中完成對test函數的調用,通過預先設置的通用函數接口,依據待調用函數的數據段、代碼段和文件頭的內存地址完成對該函數的調用。
由於本發明實施例將函數的源文件編譯成二進位文件,即將高級程序語言編寫的代碼編譯成二進位機器碼進行傳遞,不需要關心函數的應用層含義,對於底層而言均是字節流。所以,本發明實施例提供的是一種通用的函數調用方法,能夠自動化的完成函數的調用,提高了函數調用效率,且不需要操作人員具有計算機編程知識。
本發明實施例不僅提供了一種通用的函數調用方法,還相應的提供了一種通用的函數棧,即虛擬棧,用於解決通用參數傳遞的問題。在利用通用的函數調用方法和通用的函數棧時,不需要關心函數應用層的信息,從底層的角度完成對函數的調用,以及對函數的測試。
另一種應用場景中,本發明實施例提供的函數調用方法還可以應用於軟體功能模塊之間的調用。
具體的,當一個應用軟體需要調用另一個應用軟體中的功能函數時,利用本發明提供的函數調用方法,不需要關心待調用函數的接口信息,甚至不需要關心待調用函數的程式語言等等,也就是說,由不同的程式語言編寫的功能函數之間能夠互相調用。
具體的,首先將該功能函數的源文件編譯成二進位文件,其中二進位文件中包括數據段、代碼段和文件頭;其次,將數據段、代碼段和文件頭加載入內存中,並記錄內存地址;最後,調用方應用軟體的地址跳轉到該內存地址,通過通用函數接口,依據該內存地址調用被調用方的功能函數。
與上述方法實施方式相對應的,本發明實施例還提供了一種函數調用裝置,參考圖2,為本發明實施例提供的一種函數調用裝置結構示意圖,所述裝置包括:
編譯模塊201用於將待調用函數的源文件編譯成二進位文件,所述二進位文件中包括數據段、代碼段和文件頭,所述文件頭用於存儲所述數據段和所述代碼段的位置信息;
加載模塊202,用於將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址;
建立模塊203,用於利用程序指針寄存器建立虛擬棧,並為所述虛擬棧分配內存;
寫入模塊204,用於將所述待調用函數的參數,以二進位碼流的形式寫入所述虛擬棧,以便在所述待調用函數運行時從所述虛擬棧中調用所述參數;
調用模塊205,用於通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用。
一種實現方式中,所述待調用函數為多個時,所述裝置還可以包括:
第一拼裝模塊,用於將各個待調用函數的二進位文件中的數據段進行拼裝,得到拼裝後數據段;
第二拼裝模塊,用於將各個待調用函數的二進位文件中的代碼段進行拼裝,得到拼裝後代碼段;
獲取模塊,用於獲取拼裝後文件,所述拼裝後文件中包括所述拼裝後數據段、所述拼裝後代碼段和文件頭,所述文件頭存儲有所述拼裝後數據段和所述拼裝後代碼段的位置信息;
相應的,所述加載模塊,具體用於將所述拼裝後數據段、所述拼裝後代碼段和所述文件頭加載入內存,並記錄內存地址。
具體的,所述建立模塊可以包括:
第一分配子模塊,用於利用系統內存分配函數,為所述虛擬棧動態分配內存;
或,
第二分配子模塊,用於通過靜態連結庫或動態連接庫佔據內存,為所述虛擬棧靜態分配內存。
具體的,所述裝置可以應用於函數測試程序中。
一種實現方式中,所述裝置還包括:
內嵌或注入模塊,用於內嵌彙編指令或注入二進位指令碼,所述彙編指令和所述二進位指令碼均用於指示先將所述程序指針寄存器的值保存在所述虛擬棧的首地址中,再將所述程序指針寄存器的值修改為所述虛擬棧的首地址+4。
另外,所述裝置還可以包括:
處理模塊,用於當所述待調用函數測試結束後,返回地址寄存器,保存下一條指令的內存地址,從所述虛擬棧的首地址中讀取所述程序指針寄存器的值,並順序從所述程序指針寄存器中恢復現場。
由於本發明實施例將函數的源文件編譯成二進位文件,即將高級程序語言編寫的代碼編譯成二進位機器碼進行傳遞,不需要關心函數的應用層含義,對於底層而言均是字節流。所以,本發明實施例提供的是一種通用的函數調用裝置,能夠自動化的完成函數的調用,提高了函數調用效率,且不需要操作人員具有計算機編程知識。
本發明實施例不僅提供了一種通用的函數調用方法,還相應的提供了一種通用的函數棧,即虛擬棧。在利用通用的函數調用方法和通用的函數棧時,不需要關心函數應用層的信息,從底層的角度完成對函數的調用,以及對函數的測試。
本發明還提供了一種函數調用裝置的結構示意圖,如圖3所示,其中,所述設備至少包括一個存儲器301和至少一個處理器302,還包括至少一個網絡接口303;存儲器301、處理器302和網絡接口303之間通過總線相互連接。
存儲器301用於存儲程序代碼,並將該程序代碼傳輸給該處理器302。
處理器302用於根據所述程序代碼中的指令,執行以下步驟:將待調用函數的源文件編譯成二進位文件,所述二進位文件中包括數據段、代碼段和文件頭,所述文件頭用於存儲所述數據段和所述代碼段的位置信息;
將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址;
利用程序指針寄存器建立虛擬棧,並為所述虛擬棧分配內存;
將所述待調用函數的參數,以二進位碼流的形式寫入所述虛擬棧,以便在所述待調用函數運行時從所述虛擬棧中調用所述參數;
通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用。
進一步的,所述待調用函數為多個時,所述方法還包括:
將各個待調用函數的二進位文件中的數據段進行拼裝,得到拼裝後數據段;
將各個待調用函數的二進位文件中的代碼段進行拼裝,得到拼裝後代碼段;
獲取拼裝後文件,所述拼裝後文件中包括所述拼裝後數據段、所述拼裝後代碼段和文件頭,所述文件頭存儲有所述拼裝後數據段和所述拼裝後代碼段的位置信息;
相應的,所述將所述數據段、所述代碼段和所述文件頭加載入內存中,並記錄內存地址,包括:
將所述拼裝後數據段、所述拼裝後代碼段和所述文件頭加載入內存,並記錄內存地址。
進一步的,所述為所述虛擬棧分配內存,包括:
利用系統內存分配函數,為所述虛擬棧動態分配內存;
或,
通過靜態連結庫或動態連接庫佔據內存,為所述虛擬棧靜態分配內存。
進一步的,所述方法應用於函數測試程序中。
進一步的,所述通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用之前,還包括:
內嵌彙編指令或注入二進位指令碼,所述彙編指令和所述二進位指令碼均用於指示先將所述程序指針寄存器的值保存在所述虛擬棧的首地址中,再將所述程序指針寄存器的值修改為所述虛擬棧的首地址+4。
進一步的,所述通過調用預設通用函數接口,利用所述虛擬棧,並依據所述內存地址,對所述待調用函數進行調用之後,還包括:
當所述待調用函數測試結束後,返回地址寄存器,保存下一條指令的內存地址,從所述虛擬棧的首地址中讀取所述程序指針寄存器的值,並順序從所述程序指針寄存器中恢復現場。
對於裝置實施例而言,由於其基本對應於方法實施例,所以相關之處參見方法實施例的部分說明即可。以上所描述的裝置實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部模塊來實現本實施例方案的目的。本領域普通技術人員在不付出創造性勞動的情況下,即可以理解並實施。
需要說明的是,在本文中,諸如第一和第二等之類的關係術語僅僅用來將一個實體或者操作與另一個實體或操作區分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關係或者順序。而且,術語「包括」、「包含」或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備所固有的要素。在沒有更多限制的情況下,由語句「包括一個……」限定的要素,並不排除在包括所述要素的過程、方法、物品或者設備中還存在另外的相同要素。
以上對本發明實施例所提供的一種函數調用方法及裝置進行了詳細介紹,本文中應用了具體個例對本發明的原理及實施方式進行了闡述,以上實施例的說明只是用於幫助理解本發明的方法及其核心思想;同時,對於本領域的一般技術人員,依據本發明的思想,在具體實施方式及應用範圍上均會有改變之處,綜上所述,本說明書內容不應理解為對本發明的限制。