c - 通过内联汇编交换 2 个指针

标签 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 。我是否对内存做了非法的事情?

最佳答案

执行此操作的经典方法是使用多个 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/

相关文章:

c - 哪个更好 - printf 或 fprintf

c++ - 在哪里可以找到 AIX 的静态 Xerces 3.0.0 库

c - 汇编 intel x86 结构,并接收结构作为参数

c - 在 C 中使用 x86 风格的跳转表

assembly - 为什么在执行 mov eax,0FFFFFFFFh 后,寄存器 eax 在调试器中显示为 0xccffffffh

浮点表达式的汇编时求值

CFStringCreateWithCString 对于少于 10 个字符的字符串返回 null

java - Ghost4J/Ghostscript - 尝试将字体嵌入 PDF 时出现错误 100

c - 堆栈上的局部变量和 EBP 之间是什么?

c - 如何修改已传递给 C 函数的指针?