我正在使用 VS 2012 进行开发,在 64 位操作系统下,但输出可执行文件是 32 位。最近我在摆弄交换算法。我确实在 C 上实现了它;
void swap(int *p1, int *p2)
{
*p1 = *p1 + *p2;
*p2 = *p1 - *p2;
*p1 = *p1 - *p2;
}
但我也想通过内联汇编来做到这一点(__asm)。我尝试使用这些代码;
void aswap(int *p1, int *p2)
{
__asm {
mov ebx, p1
mov ecx, p2
mov p1, ecx
mov p2, ebx
}
}
并使用这些代码测试 aswap()
;
int a = 10;
int b = 200;
// print out the initial values
printf("%x(%d) %x(%d)\n", &a, a, &b, b);
aswap(&a, &b);
// finally print out the swapped values
printf("%x(%d) %x(%d)\n", &a, a, &b, b);
但是各个地址和(因此)值不会改变。
请帮助我。提前致谢。
<小时/>更新1:@ouah
我已经用这些代码测试了 swap()
;
#include <limits>
int a = INT_MAX;
int b = INT_MAX - 1;
...
这是我的 screenshot 。我是否对内存做了非法的事情?
最佳答案
执行此操作的经典方法是使用多个 XOR 操作进行内联交换。假设您在 EAX 中有一个指针,在 EBX 中有另一个指针,代码将是:
XOR EAX, EBX
XOR EBX, EAX
XOR EAX, EBX
结果是,EAX 中的内容现在位于 EBX 中,EBX 中的内容现在位于 EAX 中。跟随弹跳位来弄清楚它是如何工作的(并且它完全在寄存器中完成,不需要额外的内存)。
分享并享受。
关于c - 通过内联汇编交换 2 个指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753278/