【发布时间】:2013-04-15 01:40:56
【问题描述】:
我正在做一个 cpp 项目。项目需要迁移到 64 位。它包含一些不能在 x64 上编译的内联汇编代码。 这是包含汇编代码的函数:
void ExternalFunctionCall::callFunction(ArgType resultType, void* resultBuffer)
{
#if defined(_NT_) || defined(__OS2__)
// I386
// just copy the args buffer to the stack (it's already layed out correctly)
int* begin = m_argsBegin;
int* ptr = m_argsEnd;
int arr[1000], i=0;
while (ptr > begin) {
int val = *(--ptr);
__asm push val
}
void* functionAddress = m_functionAddress;
// call the function & handle the return value. use __stdcall calling convention
switch (resultType) {
case voidType:
__asm {
call functionAddress
}
break;
case pointerType:
case int32Type:
__asm {
call functionAddress
mov ebx, resultBuffer
mov dword ptr [ebx],eax
}
break;
case floatType:
__asm {
call functionAddress
mov ebx, resultBuffer
fstp dword ptr [ebx]
}
break;
case doubleType:
__asm {
call functionAddress
mov ebx, resultBuffer
fstp qword ptr [ebx]
}
break;
}
我使用堆栈、数组来迁移这个“asm push val”,但没有用。虽然,它不会抛出任何编译错误,但逻辑不起作用。
所以,我想问,我可以在 C++ 中使用什么来代替“__asm push val”。任何帮助将不胜感激。
【问题讨论】:
-
这不是程序中唯一的汇编指令吗?你如何使用推送的值?目前没有足够的信息来帮助您。
-
您需要显示更多代码,以便我们知道对压入堆栈的值做了什么。
-
标准 C++ 不包括内联汇编语言或任何用于直接修改 CPU 堆栈的操作....如果它正在为函数调用或其他东西准备值,则可能有其他方式来提供参数。它可能高度特定于您的操作系统和/或编译器,您没有说明。
-
这是某种“可变参数”函数调用吗?如果是这样,论点的范围有多大?
-
您好 Konrad/Michael/Tony/Mats,现在您可以看到完整的函数代码,其中包含 asm 代码。
标签: c++ inline-assembly