内联汇编语言

Inline assembly language

本文关键字:汇编语言      更新时间:2023-10-16

我正在做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都是动态数组)。这个while循环在每次调用这个"callFunction"函数时执行4次。因此,总共4x4 = 16个值将存储在"连续内存位置"中,这就是我猜的"__asm push val"。我需要在c++中实现这个。我尝试了所有可能的方法(堆栈,数组,链表,队列甚至将其分离到一个单独的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"

,我将这个函数调用为:

while (ptr > begin) {
        int val = *(--ptr);
        callFunction_asm(val); //possible replacement
    }

但即使这是不工作,谁能告诉我哪里错了。我是汇编代码的新手。

push将其操作数放在堆栈上,同时堆栈指针自减。

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