我有一段C++代码(在GNU/Linux环境下用g ++编译)加载函数指针(它的作用如何并不重要),并将一些参数推入堆栈一些内联汇编,然后调用该函数,代码如下:32位到64位内联汇编移植
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");
我想补充某种
#ifdef _LP64
// 64bit inline assembly
#else
// 32bit version as above example
#endif
但我不知道64位的机器,任何人都内嵌汇编可以帮助我吗?
感谢
Simone,我相信你正在寻找应用程序二进制接口ABI。 – 2010-03-25 22:27:39
您是否可以首先了解为什么使用内联汇编调用函数的原因? 当您移动堆栈指针时,用C代码混合程序块会很危险。我很高兴ret的价值能够幸免于难。 – nategoose 2010-03-26 18:47:18