Работа с Ассемблером. Готовая лаба №1. Лабораторна робота 1 з дисципліни "Архітектура компютерів" Лінійні програми. Арифметичні команди мп intel х86 хаі. 503. 525А. 19о. 123, 1805033
Скачать 42.69 Kb.
|
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ Національний аерокосмічний університет ім. М.Є. Жуковського “Харківський авіаційний інститут” Кафедра комп’ютерних систем, мереж і кібербезпеки Лабораторна робота №1 з дисципліни “Архітектура комп’ютерів” Лінійні програми. Арифметичні команди МП Intel х86 ХАІ.503.525А.19о. 123, 1805033 Виконав студент гр.525а Іванський ОлександрСергійович (№ групи) (П.І.Б.) (підпис, дата) Перевірив к.т.н доцент (науковий ступінь, вчене звання, посада) 19.09.2019 Дужий В.I. (підпис, дата) (П.І.Б.) 2019 Цель: Изучение арифметических команд. Изучение различных форм арифметических команд. Изучение директив ассемблера для размещения в памяти целочисленных данных. Изучение команд условного перехода по значению одного флажка. Задание: Написать программу, проверяющую ряд тождеств, часть из которых является общеизвестными арифметическими тождествами. Для этого необходимо вычислить левую и правую часть арифметического выражения. В процессе вычислений необходимо контролировать переполнение разрядной сетки. Результаты вычислений отображаются на экране. Исходные данные: Операнды a, b и c (при необходимости), размещенные в памяти. При вычислении значений арифметических выражений используют значения, вычисленные с использованием значений операндов по формулам: a/(n+2), b/(n+3), c/(n+4), где n - номер варианта. Требуемый результат: Значение левой и правой частей арифметического выражения: left и right. Вариант №5 a^2 - b^2= (a-b)*(a+b) Алгоритм решения задачи на псевдокоде: Начало Ввод а и b a1 = a/(VAR + 2); b1 = b/(VAR + 3); left = a1*a1 - b1*b1; right = (a1 - b1)*(a1 + b1); Расчет левой и правой части в assembler Проверка на переполнение Вывод left,right,left_a,right_a Конец Схема алгоритма: Расчет на assembler Рис.1 – Схема алгоритма решения задачи Код программы: #include #include #include #define VAR 5 long a, b, a1, b1, left, right, left_a, right_a,err; //глобальные переменные int main(void) { setlocale(LC_CTYPE, "rus"); for (;;) { printf("Введите целое число a и b : \n"); scanf_s("%li%li", &a, &b); a1 = a/(VAR + 2); b1 = b/(VAR + 3); left = a1*a1 - b1*b1; right = (a1 - b1)*(a1 + b1); __asm {// a1=a/(VAR+2) mov err, 0 mov ebx, VAR+2 mov eax, a cdq idiv ebx mov esi, eax // b1=b/(VAR+3) mov ebx, VAR + 3 mov eax, b cdq idiv ebx mov edi, eax // Вычислить левую часть тождества //(a1*a1-b1*b1) left mov eax, esi imul eax, eax//a*a jo Error //проверка на переполнение при возведении а в квадрат mov ebx, edi imul ebx, ebx//b*b jo Error //проверка на переполнение при возведении b в квадрат sub eax, ebx mov left_a, eax // Вычислить правую часть тождества // (a1-b1)*(a1+b1) right_a mov eax, esi sub eax, edi//a1-b1 mov ebx, edi add ebx, esi//a1+b1 mov esi, ebx imul esi, eax mov right_a, esi jmp NoError Error: mov err,1 NoError: }; if(err==1) { printf("Переполнение!\n"); continue; } printf("Левая часть тождества ( C ): %li\n", left); printf("Правая часть тождества( С ): %li\n", right); printf("Левая часть тождества (Asm): %li\n", left_a); printf("Правая часть тождества(Asm): %li\n", right_a); // Вывод результатов } system("pause"); } Тестовые наборы:
Выводы: изучены различные формы арифметических команд, изучены директивы ассемблера для размещения в памяти целочисленных данных, получены навыки программирования на Assembler. |