Ассемблерная вставка в С++ - Assembler

Узнай цену своей работы

Формулировка задачи:

Привет, есть простая функция по обмену двух переменных, механизм обмена реализован через асм. вставку. В самой функции переменные меняются значениями, а вот при возврате в main() значение остаются теми же, можете объснить с чем это связано? Никак не могу понять в чем дело.
#include <iostream>
using namespace std;
 
void Swap(int &a, int &b)
{
    _asm
    {
        mov eax, a
        xchg eax, b
        mov a, eax
    }
}
 
int main()
{
    int a = 2, b = 3;
    cout << "a, b: " << a << ", " << b << endl; // выводит 2 и 3
    Swap(a, b);
    cout << "a, b: " << a << ", " << b << endl; // выводит 2 и 3
    system("pause");
    return 0;
}

Решение задачи: «Ассемблерная вставка в С++»

textual
Листинг программы
mov esi,a
mov edi,b
mov eax,[edi]
xchg    eax,[esi]
mov [edi],eax

Объяснение кода листинга программы

  1. Переменная esi содержит значение a.
  2. Переменная edi содержит значение b.
  3. Значение из памяти, адрес которой содержится в переменной edi, записывается в регистр eax.
  4. Значение в регистре eax обменивается с памятью по адресу, содержащемуся в переменной esi.
  5. Результат записи в память по адресу, содержащемуся в переменной edi, сохраняется в регистре eax.

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы