作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了交换两个整数的函数,我想获取两个值然后将其放入变量:
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/
我是一名优秀的程序员,十分优秀!