c++ - 内联汇编语言

标签 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 是一个外部函数,我将其声明为:

外部“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/

相关文章:

assembly - C64 程序集 - 6502/6510 - 依次显示一系列三个位图,然后进入字符模式

java - 内存分配是基于引用类还是实例类?

c++ - C/C++ 中的 sizeof char* 数组

c++ - "delete"在 C++ 中实际上做了什么?

c++ - 为什么当我试图返回引用时我的对象仍然被复制

matlab - 取决于距离函数,matlab 中的 k-means 内存不足?

java - 降低Java中数据结构的内存占用

c - 如何在 Visual C++ 6.0 中编写以下内联汇编代码?

c - 在 Xilinx Microblaze 中使用 C 语言内联汇编

c++ - read() 返回在某些系统上读取的错误字节数