gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:13:56 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com