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