我正在使用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。我是否对记忆做了违法的事情?
答案 0 :(得分:-1)
执行此操作的经典方法是使用多个XOR操作进行内联交换。假设您在EAX中有一个指针而另一个在EBX中,则代码为:
XOR EAX, EBX
XOR EBX, EAX
XOR EAX, EBX
结果是EAX中的内容现在在EBX中,而EBX中的内容现在在EAX中。按照弹跳位来弄清楚它是如何工作的(它完全在寄存器中完成,不需要额外的内存)。
分享并享受。