在another question我遇到了移植代码的问题
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位之间的调用转换差异和可移植性问题。
好吧,我在网上找不到任何有用的文档,或者至少不是我需要实现的那种,所以,我怎样才能使用这些函数将参数推送到堆栈,调用泛型函数指针,获取返回值然后恢复寄存器?
答案 0 :(得分:1)
最后我使用的是libffi。
答案 1 :(得分:0)
维基百科页面有一个不错的example。
这不是您正在寻找的解决方案。 makecontext
不接受数组而是接受变量参数列表。因此,为了调用它,您需要一个函数将数组转换为参数列表。由于这是您想要的makecontext
,所以当您使用它时,您已经解决了问题。
我不知道解决方案是什么,但这是一个死胡同。