使用内联汇编交换2个指针

我正在开发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  int a = INT_MAX; int b = INT_MAX - 1; ... 

这是我的截图 。 我是否对记忆做了违法的事情?

执行此操作的经典方法是使用多个XOR操作进行内联交换。 假设您在EAX中有一个指针而另一个在EBX中,则代码为:

 XOR EAX, EBX XOR EBX, EAX XOR EAX, EBX 

结果是EAX中的内容现在在EBX中,而EBX中的内容现在在EAX中。 按照弹跳位来弄清楚它是如何工作的(它完全在寄存器中完成,不需要额外的内存)。

分享和享受。