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

标签 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

我哪里弄错了?

最佳答案

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

因此,是的,你有指针,然后你必须尊重它们以交换变量值。有关(工作)汇编代码的示例,请查看 this post在这里。

此外,我建议也使用 __declspec(naked),这样您就可以编写自己的简短序言/结尾(否则自定义汇编函数的性能优势非常小,如果有好处的话)完全没有)。

也就是说,您甚至不需要为此使用寄存器,您可以使用堆栈来完成,只需按相反的顺序pop即可:

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

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

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

关于c++ - 如何在 Visual C++ 内联汇编程序中通过引用获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634050/

相关文章:

C 指向函数指针的外部指针

c++ - Eclipse反汇编 View ,可以在不调试程序的情况下查看反汇编吗?

assembly - 气体 : too many memory reference

C++ 转换并写入值为 10 的无符号整数给出 5 个字节

java - Android : sending data to a WebView with loadUrl or retrieving it from the WebView with a JavascriptInterface? 中什么更快

Java:对于这种情况我应该使用什么集合类型?

javascript - 在不牺牲性能的情况下使用 Javascript 进行加密

C++纯虚函数有主体

c++ - 使用 vcpkg 编译 gRPC C++ 示例

c++ - 保留超出范围的类的数据?