C/C++MUD代码中的asm易失性问题

asm volatile issue in C/C++ MUD code

本文关键字:asm 易失性 问题 C++MUD 代码      更新时间:2023-10-16

我正在和一个朋友一起开发一个旧的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, %%eaxnt" 
                "pushl  %%eaxnt" 
                :                       
                : "r"(ptrs[i])
                : "%eax");
// ==============
    }
    (*funcptr) ();
    va_end(ap);
}

这绝非小事,因为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的调用约定],否则不太可能生成非常糟糕的代码。