Главная страница

Работа с Ассемблером. Готовая лаба №1. Лабораторна робота 1 з дисципліни "Архітектура компютерів" Лінійні програми. Арифметичні команди мп intel х86 хаі. 503. 525А. 19о. 123, 1805033


Скачать 42.69 Kb.
НазваниеЛабораторна робота 1 з дисципліни "Архітектура компютерів" Лінійні програми. Арифметичні команди мп intel х86 хаі. 503. 525А. 19о. 123, 1805033
АнкорРабота с Ассемблером
Дата17.11.2019
Размер42.69 Kb.
Формат файлаdocx
Имя файлаГотовая лаба №1.docx
ТипЛабораторна робота
#95623

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

Національний аерокосмічний університет ім. М.Є. Жуковського “Харківський авіаційний інститут”

Кафедра комп’ютерних систем, мереж і кібербезпеки

Лабораторна робота №1

з дисципліни “Архітектура комп’ютерів”
Лінійні програми. Арифметичні команди МП Intel х86
ХАІ.503.525А.19о. 123, 1805033


Виконав студент гр.52Іванський ОлександрСергійович

(№ групи) (П.І.Б.)





(підпис, дата)
Перевірив к.т.н доцент

(науковий ступінь, вчене звання,

посада)
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");

}
Тестовые наборы:



Тестовый набор

Ожидаемый результат

Полученный результат

Вывод

1

a=300;b=265

675=675;675=675

675=675;675=675

Тест пройден

2

a=-300;b=-265

675=675;675=675

675=675;675=675

Тест пройден

3

a=300;b=-265

675=675;675=675

675=675;675=675

Тест пройден

4

a=-300;b=265

675=675;675=675

675=675;675=675

Тест пройден

5

a=100000000; b=100000000

Переполнение

Переполнение

Тест пройден




Выводы: изучены различные формы арифметических команд, изучены директивы ассемблера для размещения в памяти целочисленных данных, получены навыки программирования на Assembler.


написать администратору сайта