2010-03-26 34 views
2

another question我有問題,將代碼移植setcontext和makecontext調用一個泛型函數指針

unsigned long stack[] = { 1, 23, 33, 43 }; 

/* save all the registers and the stack pointer */ 
unsigned long esp; 
asm __volatile__ ("pusha"); 
asm __volatile__ ("mov %%esp, %0" :"=m" (esp)); 

for(i = 0; i < sizeof(stack); i++){ 
    unsigned long val = stack[i]; 
    asm __volatile__ ("push %0" :: "m"(val)); 
} 

unsigned long ret = function_pointer(); 

/* restore registers and stack pointer */ 
asm __volatile__ ("mov %0, %%esp" :: "m" (esp)); 
asm __volatile__ ("popa"); 

到64位平臺和很多人告訴我,我應該使用,而不是設置由於setcontext和makecontext功能32位和64位之間的調用轉換差異以及可移植性問題。

嗯,我真的找不到任何有用的文檔在線,或者至少不是我需要實現這一點的那種,所以,我如何使用這些函數將參數推入堆棧,調用泛型函數指針,獲取返回值,然後恢復寄存器?

回答

1

最後我用的是libffi。

0

維基百科頁面有一個不錯的example

這不是您正在尋找的解決方案。 makecontext不接受數組,而是一個可變參數列表。所以,爲了調用它,你需要一個將數組轉換爲參數列表的函數。因爲這是你想要的makecontext,你可以使用它,你已經解決了你的問題。

我不知道解決方案是什麼,但這是一個死衚衕。

+0

好的,但我如何將ulong值插入堆棧? – 2010-03-26 00:44:23

+0

好吧,但問題是,makecontext想要的功能的參數,我不知道他們的數量,他們可能是2個參數爲沒有,或4 ... – 2010-03-26 01:20:11