内联汇编语言

时间:2013-04-30 07:50:34

标签: c++ memory-management assembly

我正在进行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
    }

但即使这不起作用,任何人都可以告诉我哪里出错了。我是汇编编码的新手。

1 个答案:

答案 0 :(得分:2)

push将其操作数放在堆栈上,并递减堆栈指针。

如果您查看堆栈指针加1(1($sp)),您应该会看到该值(但如果您想要它,则通常使用pop)。