如何在visual c ++内联汇编程序中通过引用获取值?

时间:2013-12-17 12:24:30

标签: c++ performance assembly x86 inline-assembly

我写了交换两个整数的函数,我想取两个值,然后将它放到变量中:

inline void swap_fast(int32& a, int32& b)
{
    ASM // __asm {
        mov eax, [a]
        mov ebx, [b]
        mov [a], ebx
        mov [b], eax
    ENDASM // }
}

但似乎我在拿地址而不是价值。

EAX = 0023FEB0 EBX = 0023FEA4

我在哪里弄错了?

1 个答案:

答案 0 :(得分:3)

从编译代码的角度来看,引用是指针(这就是它们表现得像指针的原因)。它的编译器不允许您将它们作为C ++代码中的指针进行管理(C ++,而不是C,因为C没有引用)。

由于这个原因是的,你有指针然后你必须尊重他们交换变量值。有关(工作)汇编代码的示例,请参阅此处的this post

此外我建议也使用__declspec(naked),这样你就可以编写自己的简短prolog / epilog(如果有一个好处的话,自定义汇编函数的性能优势非常小)。

那就是说你甚至不需要使用一个寄存器,你可以用堆栈来做,只需pop反向顺序:

__declspec(naked) void swap_fast(int32& a, int32& b)
{
    __asm
    {
        push [a]
        push [b]
        pop [a]
        pop [b]
    }
}

同样可以通过寄存器(作为你正在做的临时变量,只是 deference指针)或xchg来完成,我想那里有太多的在C,C ++和汇编中执行交换的不同算法。

有关性能的重要说明:实际上我不知道哪种方法更快;可能一个带有临时(register?)变量的宏与我们的 smart 汇编代码具有相同的速度,因为编译器可以更好地优化生成的汇编...