我正在进行 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
}
但即使这样也行不通,谁能告诉我哪里出错了。我是汇编编码的新手。
最佳答案
push
将其操作数放入堆栈,同时递减堆栈指针。
如果您查看堆栈指针加 1 (1($sp)
),您应该会看到该值(但如果您想要它返回,您通常会使用 pop
)。
关于c++ - 内联汇编语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16294841/