Переключение 2 указателей с встроенной сборкой

Я разрабатываю 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  int a = INT_MAX; int b = INT_MAX - 1; ... 

и вот мой скриншот . Я сделал что-то незаконное с памятью?

Классический способ сделать это – сделать встроенный обмен с несколькими операциями XOR. Предполагая, что у вас есть один указатель в EAX, а другой в EBX – код:

 XOR EAX, EBX XOR EBX, EAX XOR EAX, EBX 

В результате EAX теперь находится в EBX, а то, что было в EBX, теперь находится в EAX. Следуйте за прыгающими битами, чтобы выяснить, как это работает (и это делается полностью в регистрах, не требующих дополнительной памяти).

Поделитесь и наслаждайтесь.