8

以下のコードでは、どちらの場合も出力は同じままです。私が欠けているものを指摘してくれてありがとう:-

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;
}
4

2 に答える 2

4

アセンブリブロック内の変数の間接参照は機能しません。代わりに、レジスタ内のアドレスを取得してから、間接参照のみを試行します。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;
}
于 2012-09-02T16:59:33.980 に答える
-3

Xor演算と交換できます-

void swap(int *x, int *y)
{
     *x = *x ^ *y; /* #1 */
     *y = *x ^ *y; /* #2 */
     *x = *x ^ *y; /* #3 */
}
于 2012-09-02T17:30:18.150 に答える