gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:50:10 25 4
gpt4 key购买 nike

我编写了交换两个整数的函数,我想获取两个值然后将其放入变量:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com