我正在进行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是一个extern函数,我将其声明为:
extern“C” void callFunction_asm(int val);
我将此功能称为:
while (ptr > begin) {
int val = *(--ptr);
callFunction_asm(val); //possible replacement
}
但即使这不起作用,任何人都可以告诉我哪里出错了。我是汇编编码的新手。
答案 0 :(得分:2)
push
将其操作数放在堆栈上,并递减堆栈指针。
如果您查看堆栈指针加1(1($sp)
),您应该会看到该值(但如果您想要它,则通常使用pop
)。