МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ ИМ. В.Я. ГОРИНА» ИНЖЕНЕРНЫЙ ФАКУЛЬТЕТ КАФЕДРЫ ПРИКЛАДНОЙ ИНФОРМАТИКИ И МАТЕМАТИКИ ВЫЧЕСЛИТЕЛЬНЫЕ СИСТЕМЫ, СЕТИ И ТЕЛЕКОММУНИКАЦИИ Лабораторная работа №3 “Введение в программирование на С/С++ с применением ассемблерных вставок. Первая программа на языке C/C++” Выполнил: Черняев Н.А. Проверил: Майский, 2024г. Введение 1. Запускаем Microsoft Visual Studio 2010, выбираем Файл – Создать – Проект… : Рис. 3.1. Создание нового проекта 2. В открывшемся окне выбираем Другие языки – Visual C++ Win32 – Консольное приложение Win32 Проекту необходимо задать имя и указать расположение. Выбранный тип проекта позволяет создавать приложение-«обертку» для нашего ассемблерного кода, используя только APIфункции Windows. Рис. 3.2. Окно создания нового проекта 3. В открывшемся диалоговом окне необходимо нажать Далее, затем выбрать тип приложения Консольное приложение и отметить галочку Пустой проект, затем нажать Готово. Рис. 3.3 Окно мастера приложений Рис. 3.4. Выбор типа приложения 4. После того, как проект создан, в Обозревателе решений выбираем Файлы исходного кода – Добавить – Создать элемент … (Обозреватель решений доступен во вкладке Вид). Рис. 3.5. Создание нового элемента в проекте 5. В открывшемся диалоговом окне выбираем Файл С++(.cpp). Поскольку мы предполагаем использовать лишь один файл в нашем проекте, назовем его также, как и проект. Рис. 3.6. Выбор типа создаваемого элемента 6. Напишем элементарную программу. /* подключаемые заголовочные файлы */ #include <stdio.h> // необходим для работы printf #include <conio.h> // необходим для работы _getch(); /* объявления функций */ int add(int, int); // складывает два целых числа int sub(int, int); // вычитает из первого целого второе int prov(int, int); // выполняет sub, // иначе выполняет add в случае, если первое число больше второго, /* глобальные переменные */ int i1, i2; void main() // основная функция. Тип void означает, что эта функция ничего // не возвращает { i1 = 10; // объявляем локальные переменные i2 = 20; printf("%d\n", prov(i1, i2)); // выводим результат функции prov // запись в кавычках определяет формат вывода: // %d означает, что будет выведено целое число, // \n означает "конец строки" _getch(); // ждет ввода любого символа с клавиатуры и возвращает его, // используется для того, чтобы консоль не закрывалась после выполнения // программы в режиме отладки } /* реализация функций */ int prov(int a, int b) { int res; if (a>b) res = sub(a, b); else res = add(a, b); return res; } int add(int a, int b) { return a+b; } int sub(int a, int b) { return a-b; Ход работы: 1. Найдите сумму чисел, находящихся в регистрах EAX, EBX, ECX, накапливая ее в регистре EDX. Содержимое регистров EAX, EBX, ECX не меняйте. Код программы: #include <iostream> int main() { int eax, ebx, ecx, edx = 0; // Вводим значения для регистров std::cout << "Введите значения для регистров EAX, EBX, ECX: "; std::cin >> eax >> ebx >> ecx; // Суммируем значения регистров EAX, EBX, ECX, накапливаем результат в регистр EDX asm( "mov %1, %%eax\n" // Перемещаем значение из переменной eax в регистр eax "mov %2, %%ebx\n" // Перемещаем значение из переменной ebx в регистр ebx "mov %3, %%ecx\n" // Перемещаем значение из переменной ecx в регистр ecx "add %%eax, %%edx\n" // Добавляем значение регистра eax к регистру edx "add %%ebx, %%edx\n" // Добавляем значение регистра ebx к регистру edx "add %%ecx, %%edx\n" // Добавляем значение регистра ecx к регистру edx : "=d" (edx) // Выходной операнд, результат операции сохраняется в переменной edx : "r" (eax), "r" (ebx), "r" (ecx) // Входные операнды, значения берутся из переменных eax, ebx, ecx : "eax", "ebx", "ecx" // Список регистров, которые будут использоваться, нужен для указания регистров, которые будут изменены в инструкциях ассемблера ); // Выводим результат std::cout << "Сумма чисел в регистрах EAX, EBX, ECX, накопленная в регистре EDX: " << edx << std::endl; return 0;} Пример работающей программы: 2.Найдите разность суммы чисел, находящихся в регистрах EAX, EBX, и числа из регистра ECX. Результат – в регистре EDX. Содержимое регистров EAX, EBX, ECX не меняйте. Код программы: #include <iostream> int main() { int eax, ebx, ecx, edx; // Вводим значения для регистров std::cout << "Введите значения для регистров EAX, EBX, ECX: "; std::cin >> eax >> ebx >> ecx; // Находим сумму чисел в регистрах EAX и EBX asm( "mov %1, %%eax\n" // Перемещаем значение из переменной eax в регистр eax "mov %2, %%ebx\n" // Перемещаем значение из переменной ebx в регистр ebx "add %%ebx, %%eax\n" // Добавляем значение регистра ebx к регистру eax : "=a" (edx) // Выходной операнд, результат операции сохраняется в переменной edx : "r" (eax), "r" (ebx) // Входные операнды, значения берутся из переменных eax и ebx : "ebx" // Список регистров, которые будут использоваться ); // Вычитаем значение регистра ECX из суммы asm( "sub %1, %%eax\n" // Вычитаем значение переменной ecx из регистра eax : "=a" (edx) // Выходной операнд, результат операции сохраняется в переменной edx : "r" (ecx), "a" (edx) // Входные операнды, значения берутся из переменных ecx и edx ); // Результат хранится в переменной edx std::cout << "Разность суммы чисел в регистрах EAX и EBX и числа из регистра ECX, накопленная в регистре EDX: " << edx << std::endl; return 0; } Пример работающего кода: 2. Сложите два вектора с целочисленными координатами (a1,a2) и (b1,b2) Код программы: #include <iostream> struct Vector { int x; int y; }; int main() { Vector a, b, result; // Вводим координаты векторов std::cout << "Введите координаты первого вектора (x, y): "; std::cin >> a.x >> a.y; std::cout << "Введите координаты второго вектора (x, y): "; std::cin >> b.x >> b.y; // Сложение векторов result.x = a.x + b.x; result.y = a.y + b.y; // Вывод результата std::cout << "Результат сложения векторов: (" << result.x << ", " << result.y << ")" << std::endl; return 0; } Пример работающего кода: 4. Найдите разность двух векторов с целочисленными координатами (a1,a2) и (b1,b2). Код программы: #include <iostream> struct Vector { int x; int y; }; int main() { Vector a, b, result; // Вводим координаты векторов std::cout << "Введите координаты первого вектора (x, y): "; std::cin >> a.x >> a.y; std::cout << "Введите координаты второго вектора (x, y): "; std::cin >> b.x >> b.y; // Вычисление разности векторов result.x = a.x - b.x; result.y = a.y - b.y; // Вывод результата std::cout << "Результат разности векторов: (" << result.x << ", " << result.y << ")" << std::endl; return 0; } Пример работающего кода: