Я разрабатываю 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. Следуйте за прыгающими битами, чтобы выяснить, как это работает (и это делается полностью в регистрах, не требующих дополнительной памяти).
Поделитесь и наслаждайтесь.