首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C/C++ MUD代码中的asm易失性问题

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

Stack Overflow用户
提问于 2014-04-26 22:56:59
回答 1查看 215关注 0票数 2

我正在和一个朋友一起做一个旧的代码库,这只是一个业余项目,但是我在让代码在除debian (x386 )以外的任何操作系统上编译都有问题。这个问题(主要是)是因为一些asm行,老实说,我对这些行还不太了解,无法修改。在VS中编译时,我收到的错误是"error c2059:语法错误“第29行。知道如何在x64操作系统上编译吗?

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-26 23:04:38

这并不简单,因为x86-64使用了传递参数的寄存器,而且它首先是一个相当难看的解决方案,因为它基本上假设寄存器中没有传递参数,被调用的函数接受堆栈上的所有参数。

我可能会完全避免使用程序集版本,而不是使用第二个for-循环(使用程序集代码)编写如下:

代码语言:javascript
运行
复制
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的调用约定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23317378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档