Загрузка данных


Ход работы

1. Постановка задачи

Согласно варианту 8, даны две переменные A и B типа long int (4 байта). Требуется переставить их значения местами:

```
До:     A = 11 22 33 44
        B = 55 66 77 88

После:  A = 55 66 77 88
        B = 11 22 33 44
```

2. Выбор среды и средств

Работа выполнялась в среде Microsoft Visual Studio (консольное приложение C++). Для решения использовалась ассемблерная вставка __asm { ... }, встроенная в код на C++. Переменные объявлены как unsigned long, что соответствует 32-битному (4-байтному) типу и позволяет корректно выводить значения вида 0x55667788 без знака.

3. Объявление переменных

```cpp
unsigned long a = 0x11223344;
unsigned long b = 0x55667788;
```

Каждая переменная занимает 4 байта, что соответствует типу long int. Значения заданы в 16-ричной системе, так как одному байту соответствует ровно две 16-ричные цифры.

4. Вывод исходных значений

С помощью cout << hex << a << endl; и аналогичной строки для b на экран выводятся начальные значения переменных в 16-ричном виде (проверка до перестановки).

5. Реализация перестановки через ассемблерную вставку

```cpp
__asm {
    mov eax, dword ptr [b]   // EAX = b = 0x55667788
    xchg eax, dword ptr [a]  // EAX <-> a: EAX = 0x11223344, a = 0x55667788
    mov dword ptr [b], eax   // b = 0x11223344
}
```

Разбор команд:

· mov eax, dword ptr [b] — загрузка 4 байт переменной b в регистр EAX. Явное указание dword ptr задаёт длину операнда — 4 байта (32 бита).
· xchg eax, dword ptr [a] — обмен значения между регистром EAX и памятью переменной a. После этой команды в a окажется бывшее значение b, а в EAX — бывшее значение a.
· mov dword ptr [b], eax — запись содержимого EAX (бывшее a) обратно в b.

Таким образом, перестановка выполнена за три команды, при этом ключевую роль играет команда xchg.

6. Вывод результата

После ассемблерной вставки повторно выводятся значения a и b в 16-ричном виде. Сравнение вывода до и после подтверждает корректность перестановки.

7. Результат выполнения программы

```
11223344
55667788
55667788
11223344
```

Первые два числа — исходные значения a и b, вторые два — значения после перестановки. Они полностью совпадают с требуемыми по заданию.

---

Заключение

В ходе лабораторной работы были изучены принципы построения ассемблерных вставок в программы на языке высокого уровня (C++) и освоены команды пересылки данных mov и xchg.

Были рассмотрены и практически применены:

· формирование длины операнда через dword ptr (4 байта), что соответствует типу long int;
· косвенная адресация через [имя_переменной];
· обмен значениями между регистром и памятью одной командой xchg.

Поставленная задача — перестановка значений двух 32-битных переменных A и B — решена за минимальное количество команд (три команды ассемблера: две mov и одна xchg). Результат работы программы полностью соответствует заданию: значения переменных поменялись местами, что подтверждено выводом на экран до и после перестановки.

Полученные навыки могут быть использованы для оптимизации критичных участков кода, работы с регистрами процессора и реализации операций, недоступных напрямую средствами языка высокого уровня.