我正在和一个朋友一起做一个旧的代码库,这只是一个业余项目,但是我在让代码在除debian (x386 )以外的任何操作系统上编译都有问题。这个问题(主要是)是因为一些asm行,老实说,我对这些行还不太了解,无法修改。在VS中编译时,我收到的错误是"error c2059:语法错误“第29行。知道如何在x64操作系统上编译吗?
void Execute(int nArgs, ...)
{
if(MAX_FUNCTION_ARGS < nArgs)
throw "Error: CFuncPtr has too many args";
int i;
void *fptrs[MAX_FUNCTION_ARGS], *ptrs[MAX_FUNCTION_ARGS];
va_list ap;
va_start(ap, nArgs);
for(i = 0; i < nArgs; i++)
fptrs[i] = va_arg(ap, void *);
for(i = 0; i < nArgs; i++)
{
ptrs[i] = fptrs[nArgs - i - 1];
// ============== This is the part with the issue
asm volatile("" \ // This is line 29.
"movl %0, %%eax\n\t" \
"pushl %%eax\n\t" \
:
: "r"(ptrs[i])
: "%eax");
// ==============
}
(*funcptr) ();
va_end(ap);
}
发布于 2014-04-26 23:04:38
这并不简单,因为x86-64使用了传递参数的寄存器,而且它首先是一个相当难看的解决方案,因为它基本上假设寄存器中没有传递参数,被调用的函数接受堆栈上的所有参数。
我可能会完全避免使用程序集版本,而不是使用第二个for-循环(使用程序集代码)编写如下:
switch(nArgs)
{
case 0:
(*funcptr)();
break;
case 1:
(*funcptr)(fptrs[0]);
break;
case 2:
(*funcptr)(fptrs[0], fptrs[1]);
break;
... Repeat until MAX_FUNCTION_ARGS is covered.
}
除非MAX_FUNCTION_ARGS非常大,否则不太可能生成非常糟糕的代码,在这种情况下,您可能首先想要更改funcptr
的调用约定。
https://stackoverflow.com/questions/23317378
复制相似问题