Uploaded by Никита

Lb3Череяе29ПИ

advertisement
МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ
ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«БЕЛГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ
УНИВЕРСИТЕТ
ИМ. В.Я. ГОРИНА»
ИНЖЕНЕРНЫЙ ФАКУЛЬТЕТ
КАФЕДРЫ ПРИКЛАДНОЙ ИНФОРМАТИКИ И МАТЕМАТИКИ
ВЫЧЕСЛИТЕЛЬНЫЕ СИСТЕМЫ, СЕТИ И
ТЕЛЕКОММУНИКАЦИИ
Лабораторная работа №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;
}
Пример работающего кода:
Download