使用寄存器交换值

0 c c++ assembly

我一直在阅读有关交换变量内容而不使用临时变量的内容,除了着名的xor算法,我还发现了x86上汇编的XCHG指令.所以我写了这段代码:

void swap(int *left, int *right){
__asm__ __volatile__(
        "movl %0, %%eax;"
        "movl %1, %%ebx;"
        :
        : "r" (*left), "r" (*right)
    );
__asm__ __volatile__(
        "xchg %eax, %ebx;"
            );
__asm__ __volatile__(
        "movl %%eax, %0;"
        "movl %%ebx, %1;"
        : "=r" (*left), "=r" (*right)
    );}
Run Code Online (Sandbox Code Playgroud)

它确实有效但后来我意识到XCHG指令根本不需要.

void swap(int *left, int *right){
__asm__ __volatile__(
        "movl %0, %%eax;"
        "movl %1, %%ebx;"
        :
        : "r" (*left), "r" (*right)
    );
__asm__ __volatile__(
        "movl %%ebx, %0;"
        "movl %%eax, %1;"
        : "=r" (*left), "=r" (*right)
    );}
Run Code Online (Sandbox Code Playgroud)

第二个函数也可以,但似乎没有人提到使用寄存器交换变量,所以这段代码被认为是错误的,实际上它并没有真正正常工作?我错过了什么吗?

我意识到这只适用于x86,但由于大多数人拥有intel x86处理器,这个代码可以用于任何现实世界的编程吗?我意识到这可能不会比使用临时变量的常规交换更快,但我从理论的角度来问.如果在测试或面试期间有人要求我在C中编写一个函数来交换x86机器的值而不使用临时变量,那么这段代码是有效还是完全废话?谢谢.

Evi*_*ach 5

有效,是的.根据我的标准,你是一个不雇用的人.

为什么?成本.

std :: swap可以很好地完成工作,并且可能足够快.您的代码将具有更高的维护成本.

由于性能原因,肯定有时候会进入汇编程序.
这不是其中的一个.