C/C++MUD代码中的asm易失性问题
asm volatile issue in C/C++ MUD code
我正在和一个朋友一起开发一个旧的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
的调用约定],否则不太可能生成非常糟糕的代码。
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- 如何强制 GCC 以线性方式转换易失性内联程序集语句
- 我可以使用互斥锁或关键字(静态)代替C++中的易失性吗?
- C/C++MUD代码中的asm易失性问题