使用内联汇编交换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中。 按照弹跳位来弄清楚它是如何工作的(它完全在寄存器中完成,不需要额外的内存)。
分享和享受。