C / C ++ MUD代码中的asm volatile问题

时间:2014-04-26 22:56:59

标签: c++ mud

我正在和朋友一起制作一个旧的MUD代码库作为一个业余爱好项目,但我遇到的问题是在除debian之外的任何操作系统(特别是x386)中编译代码。问题是(大多数情况下)是因为我真的不太了解修改的一些asm行。我在尝试在VS中编译时收到的错误是“错误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);
}

1 个答案:

答案 0 :(得分:3)

这远非微不足道,因为x86-64使用寄存器传递参数[并且它首先是一个相当丑陋的解决方案,因为它基本上假设没有参数在寄存器中传递,并且callee函数获取堆栈上的所有参数]。

我可能完全避免使用汇编版本,而不是第二个for-loop(使用汇编代码)写下类似的东西:

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的调用约定。)