【发布时间】:2013-04-30 07:50:33
【问题描述】:
我正在做 64 位迁移,我需要将内联汇编代码移植到 cpp 这是他的代码
void ExternalFunctionCall::callFunction(ArgType resultType, void* resultBuffer)
{
// I386
// just copy the args buffer to the stack (it's already layed out correctly)
int* begin = m_argsBegin;
int* ptr = m_argsEnd;
while (ptr > begin) {
int val = *(--ptr);
__asm push val
}
}
我想将此 __asm push val 迁移到 cpp。这个函数被调用了四次,每次调用我们得到不同的 m_argsBegin 和 m_argsEnd 值(m_argsBegin 和 m_argsEnd 都是动态数组)。 每次调用此“callFunction”函数时,此 while 循环执行 4 次。因此,总共 4x4 = 16 个值将存储在“连续内存位置”中,这就是我猜的“__asm push val”。我需要在 c++ 中实现它。我尝试了所有可能的方法(堆栈、数组、Lnked 列表、队列甚至将其分离到一个单独的 asm 文件中,但没有一个有效) 有人可以帮忙吗?
我将这个内联汇编函数分离到一个单独的汇编文件中。代码如下:
.386
.model c,flat
public callFunction_asm
CSEG segment public 'CODE'
callFunction_asm PROC
push ebp
mov ebp, esp
mov ecx, [ebp+8] ;val
push dword ptr [ecx]
mov esp, ebp
pop ebp
RETN
callFunction_asm ENDP
CSEG ends
END
其中 callFunction_asm 是一个外部函数,我将其声明为:
外部“C” void callFunction_asm(int val);
我将此函数称为:
while (ptr > begin) {
int val = *(--ptr);
callFunction_asm(val); //possible replacement
}
但即使这样也行不通,谁能告诉我哪里出错了。我是汇编编码的新手。
【问题讨论】:
-
你真的需要推送吗?如果要将代码移植到 C++,为什么不将 'val' 的值存储在先前定义的数组或向量中? (如 std::vector
v; while(...) { int val = ...; v.push_back(val); } -
这里的一个问题是它强烈依赖于使用您放置在堆栈中的值的代码。你能显示那个代码吗?是否包含
__asm pop something? -
编译器为栈上的局部变量保留内存。您应该发布完整的代码,否则很难说函数真正在做什么,所以如果您发布整个函数(可能还有调用者)会很有帮助。
-
好吧,这没有任何意义。它假装为调用设置了参数,但它甚至没有进行调用。争论消失了,什么也没有发生。
标签: c++ memory-management assembly