Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер оформление.doc
Скачиваний:
6
Добавлен:
26.08.2019
Размер:
399.87 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ Одеський національний політехнічний університет Інститут комп’ютерних систем Кафедра «Комп’ютерні інтелектуальні системи та мережі»

МАШИННО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ

Курсова робота

АМКР.АЕ085.1616

Розробив: Лєсков О.О.

Перевірив: Шапорін В. О.

2010

ЗМІСТ

ВСТУП…….………………………………………………………………………………..3

1 ЗАВДАННЯ КУРСОВОЇ РОБОТИ……………………………….……………………4

1.1 Варіант завдання…………………..…………………………………………………..4

2 АРІФМЕТИКА…………………………………………………………………………..5

2.1 Розробка програми…………………………………………………………………….5

2.2 Контрольний приклад…………………………………………………………………7

3 ОБРОБКА РЯДКІВ……………………………………………………………………...8

3.1 Операції з рядками…………………………………………………………………….8

3.2 Контрольний приклад………………………………………………………………....9

ВИСНОВОК………………………………………………………………………………10

ПЕРЕЛІК ЛІТЕРАТУРИ………………………………………………………………….11

ДОДАТОК А………………………………………………………………………………12

ДОДАТОК В………………………………………………………………………………16

ДОДАТОК С………………………………………………………………………………18

ДОДАТОК D………………………………………………………………………………19

ДОДАТОК E……………………………………………………………………………….21

ДОДАТОК F……………………………………………………………………………….23

Вступ

Асемблер дозволяє дуже просто виконати так звану роботу на рівні біт, чого не дозволяють зробити з легкістю інші мови програмування, мови високого рівня. Асемблер не підтримує таких технологій як об’єктно-орієнтоване програмування, але все ж в ньому є макрозасоби, можливість писати модулі, процедури, що також спрощує розбив програми на більш прості логічні блоки з ціллю кращого розуміння програми та можливості вносити зміни тільки у частину коду, не змінюючи при цьому весь код програми. В асемблері є добрим те, що програміст сам вирішує якого типу числа ми зберігаємо у ячейках пам’яті (знакові чи беззнакові).

За допомогою асемблера можна створювати найбільш компактний та швидкий код. Жоден компілятор мов високого рівня не може дати таких результатів. Багато модулів операційних систем та навіть операційні системи повністю були написані на мові асемблера. Звичайно на асемблері пишуть програми, які можуть забезпечити ефективну роботу з апаратною частиною. Також на асемблері пишуться критичні за часом виконання або пам’яті ділянки програми. Вони можуть бути оформленими у вигляді підпрограм та сполучені з кодом на мові високого рівня.

В даній роботі розроблюються модуль для обчислення значень функції, який потім підключається до програми, в якій саме і здійснюється ввід даних з контролем припустимого значення у таблицю, а також відображення цієї таблиці. Далі розроблюється модуль для роботи з рядком, який виводить на дисплей суму цифр у введеному рядку якщо вони присутні.

1 Завдання курсової роботи

1.1 Варіант завдання

В аріант шістнадцятий, отже, арифметичний вираз такий:

2*a / b + 1, якщо a>b

Y = -445, якщо a=b

(b+5)/a, якщо a<b

Необхідно:

- написати модуль на мові Асемблера для обчислення значень виразу (у вигляді процедури або макроса);

- написати на мові Асемблера програму коректного вводу початкових даних (з контролем припустимого діапазону) в таблицю і ввода отриманого результату у вигляді таблиці;

- виконати тестові перевірки, провести аналіз результатів.

Завдання для роботи зі строками таке:

Ввести рядок символів. Вивести суму цифр у рядку, якщо вони там є.

Необхідно:

- написати модуль на мові Асемблера для обробки рядків;

- написати на мові Асемблера програму коректного вводу початкових даних;

- виконати тестові перевірки, провести аналіз результатів.

2 Арифметика

2.1 Розробка програми

При розробці проекту була використана бібліотека макросів Macro.lib, а саме наступні макроси:

- newline-переведення курсору на новий рядок;

- key_$2bin-зчитання з клавіатури в ax число зі знаком;

- crlf-переведення курсору на початок наступного рядка;

- home-переведення курсору до лівого верхнього кута на екрані;

- cls- очистка екрану.

Числа a і b мають розмір слово зі знаком. Результат має теж цей формат.

Користувачеві пропонується ввести три пари чисел. Ввід здійснюється за допомогою процедури get_n у циклі:

mov i,0

cikl_en: ; цикл ввода трьох параметрів а та b

cmp i,6 ; перевірка умови закінчення циклу ввода

jge drr

mov si,i ; лічильник i

call get_n ; викликання процедури вводу числа

call calc ; викликання процедури обчислення вирaзу

add i, 2

jmp cikl_en

Числа зберігаються у таблицях tabl_a и tabl_b. В цьому циклі також проводиться обчислення за формулою, що зазначена у завданні, функцією calc.

Процедура зчитування чисел get_n проходить за допомогою макроса key_$2bin. Число після макроса залишається в ax, після чого зберігається у своїй таблиці.

Макрос key_$2bin працює зі словом, тому для контролю діапазону [-32768; 32768] достатньо поставити після роботи цього макроса перевірку переповнення. Для контролю ввода не цифр існує перевірка CF=1, так як в випадку зустрічі символу не цифри макрос key_$2bin встановлює флаг переносу в 1. У випадку переповнення або вводу некоректного символу користувачеві потрібно знов ввести пару чисел:

jo @bad

jc @bad

Так як задана функція має розрив у точках (a=0;b<a) та (a<b;b=0), введена перевірка на рівність а та b :

mov tabl_b[si],ax

cmp tabl_a[si], ax ; перевірка a > b

jg agb

jl alb

jmp @ex

agb:

mov cx, tabl_a[si] ; якщо a>b, то а!=0

jmp @next

alb:

mov cx,tabl_b[si] ; якщо b>a,то b!=0

@next:

cmp cx, 0 ; ввод знов ->@again

jne @ex

За обставин вводу пари не з області визначення користувач мусить знов вводити пару чисел.

Передача керування DOS виконується за допомогою функції 4C переривання 21.

Функція обчислення формули calc. розташована в іншому модулі та має доступ до таблиць чисел a і b та до індексу i в них. При звертанні до елементів таблиць використовується непряма адресація через si.

Після порівняння чисел виконується обчислення по одному з рівнянь функції. Рівняння 2*a / b + 1 ( якщо a>b) реалізується кодом:

mov ax, tabl_b[si]

cwd

mov cx, tabl_a[si]

imul cx, b

idiv cx

Рівняння 2*a/b+1 (якщо a<b) виконується так:

mov ax, tabl_a[si]

mov cx, tabl_a[si]

imul cx

mov cx, tabl_a[si]

imul cx

sub ax, tabl_b[si]

cwd

mov cx, tabl_b[si]

idiv cx

При виконанні жодного з цих рівнянь, тобто при умові рівності а та b, рівняння приймає таке значення: Y =-445.

Код головної програми з процедурою get_n наведено у додатку А.

Код модуля з функцією calc наведено у додатку В.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]