我写了交换两个整数的函数,我想取两个值,然后将它放到变量中:
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
我在哪里弄错了?
答案 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 汇编代码具有相同的速度,因为编译器可以更好地优化生成的汇编...