内联汇编语言

Posted

技术标签:

【中文标题】内联汇编语言【英文标题】:Inline assembly language 【发布时间】:2013-04-30 07:50:33 【问题描述】:

我正在做 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
    

但即使这样也行不通,谁能告诉我哪里出错了。我是汇编编码的新手。

【问题讨论】:

On the stack. 你真的需要推送吗?如果要将代码移植到 C++,为什么不将 'val' 的值存储在先前定义的数组或向量中? (如 std::vector v; while(...) int val = ...; v.push_back(val); 这里的一个问题是它强烈依赖于使用您放置在堆栈中的值的代码。你能显示那个代码吗?是否包含__asm pop something 编译器为栈上的局部变量保留内存。您应该发布完整的代码,否则很难说函数真正在做什么,所以如果您发布整个函数(可能还有调用者)会很有帮助。 好吧,这没有任何意义。它假装为调用设置了参数,但它甚至没有进行调用。争论消失了,什么也没有发生。 【参考方案1】:

push 将其操作数放入堆栈,同时将堆栈指针递减。

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

【讨论】:

我知道它会将值压入堆栈,但我想知道该堆栈在内存中的位置 @user2165634 见第二段,我在这里解释。 我无法使用 __asm pop val 访问值,因为您看到 val 在 while 循环内声明,我想在循环外访问它的值而且我无法在循环外定义它导致我的代码的逻辑那样不行 @user2165634 研究一下堆栈指针是什么以及寻址模式是什么。 您可以使用__asm pop eax 然后__asm mov val, eax 其中val 是仍在范围内的任何变量的标识符(您可以在推送循环之外创建另一个val,移动原始val在该循环之前声明,或将val 更改为其他变量。

以上是关于内联汇编语言的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶——内联汇编

C语言进阶——内联汇编

GCC 扩展内联汇编简介

优化系列汇编优化技术:x86架构内联汇编及demo

内联汇编

扩展内联汇编基础