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

时间:2013-12-24 00:35:02

标签: c assembly

我正在使用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。我是否对记忆做了违法的事情?

1 个答案:

答案 0 :(得分:-1)

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

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

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

分享并享受。