【问题标题】:Unable to swap values无法交换值
【发布时间】:2012-09-02 16:57:03
【问题描述】:

在下面的代码中,两种情况下的输出都保持不变,感谢您指出我遗漏了什么:-

Before Swap:-
a=10     b=512
After Swap:-
a=10     b=512

以下是代码,它编译运行没有任何问题:-

#include <stdio.h>
int swap(int* x, int* y)
{
    if(x != y)
    {
        _asm
        {
            mov eax,[x]; x into eax
            mov ebx,[y]
            mov [x],ebx;swapping now
            mov [y],eax
        }
    }
    return 0;
}

int main () {
  int a=10,b=512;
  printf("Before Swap:- \na=%d\t b=%d\n",a,b);
  swap(&a,&b); 
  printf("After Swap:- \na=%d\t b=%d",a,b);//Value remains same
  return 0;
}

【问题讨论】:

  • 你为什么不在&lt;algorithm&gt;中使用std::swap
  • 检查 x != y 的成本可能不仅仅是交换两个相同的值。如果这是学习汇编代码的练习,很好;但编译器会尽你所能(事实上,更好——汇编代码中有一条不需要的指令)。

标签: c++ c visual-studio-2010 assembly


【解决方案1】:

汇编块内的变量没有间接将不起作用。取而代之的是在寄存器中获取地址,然后只尝试间接。它宁愿打破像mov eax, DWORD PTR _x$[ebp]这样的东西

#include <stdio.h>
int swap(int* x, int* y)
{
    if(x != y)
    {
        _asm
        {
            mov eax,x
            mov ebx,y
            mov ecx,[ebx]
            xchg ecx,[eax]
            xchg [ebx],ecx
        }
    }
    return 0;
}

int main () {
  int a=10,b=512;
  printf("Before Swap:- \na=%d\t b=%d\n",a,b);
  swap(&a,&b);
  printf("After Swap:- \na=%d\t b=%d",a,b);
  getchar();
  return 0;
}

【讨论】:

【解决方案2】:

你可以用 Xor 操作交换 -

void swap(int *x, int *y)
{
     *x = *x ^ *y; /* #1 */
     *y = *x ^ *y; /* #2 */
     *x = *x ^ *y; /* #3 */
}

【讨论】:

  • 如果两个指针相等,这会破坏值,并且它可能比使用临时变量的标准交换慢。
  • 问题不在于如何交换,而是给定的汇编代码不起作用的原因。而且 XOR 交换几乎在所有方面都比普通交换差。
  • 2 否决票...至少现在我知道这不是很好的专利。
  • 我投了第三票。现在,如果你删除它,你会得到一个徽章。 &lt;g&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2018-02-03
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多