Автор: Пользователь скрыл имя, 29 Декабря 2010 в 01:44, курсовая работа
Мета роботи: навчитися складати програму на мові асемблеру, яка використовує арифметичні та логічні операції.
Завдання:
Скласти програму моделювання операції додавання, віднімання і множення чисел з фіксованою крапкою з заданою кількістю розрядів.
Введення операндів виконувати з клавіатури.
Результати виводити на екран.
Вступ 3
1.ЗАГАЛЬНІ ВІДОМОСТІ 4
1.1.Формати числових даних 4
1.2. Виконання арифметичних операцій 5
2. Блок-схема програми 9
2.1.Головна програма 9
2.2. Блок-схеми підпрограм 10
3. Опис роботи програми 14
3.1. Опис роботи головної програм 14
3.2. Опис виконання арифметичних операцій 14
4. Лістинг програми 16
5. Результати виконання програми 26
Висновки 28
Використані джерела 29
Арифметичні операції над двійково-десятковими упакованими числами виконуються по байтах, тобто задана операція додавання або віднімання виконується одночасно над двома розрядами числа, які находяться в одному байті, починаючи з молодших розрядів.
Виконання операції додавання або віднімання здійснюється в два етапу. Спочатку над цим байтом виконується, відповідно, команда додавання (ADD, ADC) або віднімання (SUB, SBB), а потім виконується корекція результату, щоб отримати правильні значення упакованих десяткових цифр.
Для корекції результату використовуються такі команди:
DAA - Корекція результату додавання. Команда коригує в AL результат операції ADD, ADC. В регістрі AL створюються дві правильні двійково-десяткові цифри результату. Коли виникає перенесення в наступний байт, тоді CF=1.
DAS - Корекція результату віднімання. Команда коригує в AL результат операції SUB, SBB. В регістрі AL створюються дві правильні двійково-десяткові цифри результату. Коли виникає позика із наступного байта, тоді CF=1.
3. Опис
роботи програми
При запуску програми на екрані з’являється вікно привітання з інформацією про автора, вікно тримається на екрані до натиснення будь-якої клавіші. Потім екран очищується з’являється інформаційна стрічка та стрічка для введення першого числа. При введенні цифр числа програма слідкує за введеними символами та дозволяє вводити тільки знаки ’+’ чи ’-’ , цифри або знак ’.’, спроби ввести які-небудь інші символи програма ігнорує. Якщо користувач не ввів знак числа, то числу буде автоматично присвоєно знак ’+’. Також програма слідкує за переповненням розрядної сітки і якщо воно виникає, то на екрані з’явиться відповідне повідомлення, після введення числа користувач повинен підтвердити правильність введеного числа або ввести число заново. Введення другого числа відбувається аналогічно.
Після введення чисел на екрані з’являється табличка в якій виведено обидва числа та результати виконання арифметичних операцій над ними, нижче буде виведена стрічка яка пропонує продовжити або закінчити виконання програми при натисненні клавіш Y або N відповідно.
Після введення числа передаються до підпрограм які виконують над мини операції додавання, віднімання та множення.
Спочатку порівнюються числа без знаків, це потрібно для правильного виконання операції віднімання, може виникнути три варіанти виконання операцій:
A>B
A<B
A=B
Після цього порівнюються знаки чисел, при виникненні першої ситуації (A>B) операції додавання та віднімання не змінюють своїх параметрів, а операція множення залежно від знаків чисел змінює знак добутку:
Якщо знаки числа А та числа В співпадають то знак добутку буде ’+’
Якщо знаки числа А та числа В не співпадають то знак добутку буде ’-’
При виникненні другого варіанту (A<B) спочатку з’ясовується чи однаковий знак вони мають, якщо так, то додавання виконується без змін, а при виникненні в числа А знаку ’+’ віднімання проходить в зворотному напрямку (В-А), а добутку присвоюється знак ’+’. Якщо обидва числа від’ємні, то операції проходять ідентично. Якщо знаки відрізняються, то віднімання проходить в зворотному напрямку (В-А), додавання –– в прямому (А+В), а добутку присвоюється знак ’-’.
При виникненні третього варіанту (А=В) порівнюються знаки чисел, якщо знаки однакові, то додавання виконується без змін, різниці присвоюється нуль, а добутку присвоюється знак ’+’. Якщо знаки різні, то сумі присвоюється значення ’0’, різниці присвоюється значення суми (А+В), а добутку присвоюється знак ’-’.
Всі арифметичні операції виконуються підпрограмами які працюють з числами без знаків, бо знаки результатів обирає основна програма.
;по 3 цифр в целой и дробной части
DSEG SEGMENT
znA DB 1 ;знак первого числа
manA DB 10 dup(1) ;первое число
znB DB 1 ;знак второго числа
manB DB 10 dup(1) ;второе число
znC DB 1 ;знак результата + и -
manC DB 11 dup(0) ;результат + и-
znmnog DB 1 ;знак результата *
manmnog DB 20 dup(0) ;результат *
m DB 1 ;переменная для учета кол-ва
fl DB 1 ;для проверки нажатия точки
lop DW 1 ;
flag DB 1 ;для проверки нажатия минуса
titl DB ' ',13,10
DB '
Курсовая работа по дисциплине:
DB ' "Системное программирование" ',13,10
DB ' Выполнил: студент ИТПС-908 ',13,10
DB '
about2 DB
' Вводить
можно только до 3-х разрядов
в дробную и целую часть',13,10,'$'
about DB ' ',13,10
mes2 DB 'Для выхода нажмите любую клавишу ',13,10,'$'
mes3 DB 'Введите первое число: ','$'
mes4 DB 'Введите второе число: ','$'
mes5 DB 'Введены такие числа: ','$'
mes6 DB 'A = ','$'
mes7 DB 'B = ','$'
mes8 DB 'Результаты: ','$'
mes9 DB 'A+B = ','$'
mes10 DB 'A-B = ','$'
mes11 DB 'A*B = ','$'
vopros1 DB
'Подтвердите правильность
mes12 DB 'Будете продолжать (y/n) ?','$'
varn1 DB 'Попытка переполнения разрядной сетки ',10,13,'$'
varn2 DB 'Нажмите Enter для принятия неполного числа ','$'
varn3 DB 'Нажмите "." и продолжайте ввод в дробную часть ','$'
varn4 DB 160 dup (' '),'$'
mes_st DB 'Hажмите любую клавишу ','$'
DSEG ENDS
CODSEG SEGMENT
ASSUME cs:codseg,ds:dseg
;очистка экрана
Cls MACRO c1,c2
mov ah,06 ;номер функции
mov bh,07 ;код заполнителя (пробел)
mov cx,c1
;координата левого верхнего
mov dx,c2
;координата правого нижнего
int 10H
ENDM Cls
;Установка позиции курсора
Set_Kur MACRO x,y
mov ah,02
mov bh,00 ;номер страницы
mov dh,x ;номер строки
mov dl,y ;номер столбца
int 10H
ENDM
Set_Kur
;Пауза
Pause MACRO
mov ah,00
int 16H
ENDM
Pause
;Вывод сообщений на екран
Scr_Out MACRO str
mov ah,09
lea dx,str ;смещение строки
int 21H
ENDM Scr_Out
;обнуление числа
Nul MACRO operand,counter
local nextnul
mov cx,counter ;в CX - колличество байтов в operand
mov di,0 ;в DI - индекс последнего элемента operand
nextnul:
mov operand[di],'0' ;operand[di]=0
inc di
loop nextnul
ENDM Nul
;преобразование числа из ASCII формата к десятичному
Asc_Dec MACRO operand,counter
local asc
mov cx,counter
mov di,0
asc:
sub operand[di],30h ;уменьшаем на 30h
inc di
loop asc
ENDM Asc_Dec
;преобразование числа из десятичного в ASCII формат
Dec_Asc MACRO operand,counter
local decc
mov cx,counter
mov di,0
decc:
add operand[di],30h ;увеличиваем на 30h
inc di
loop decc
ENDM Dec_Asc
;вывод символа на экран
Out_Sym MACRO
mov dl,al
mov ah,02
int 21H
ENDM Out_Sym
;выход из программы
End_Task MACRO
mov ax,4C00h
int 21H
ENDM End_Task
;вывод числа
Op_Out MACRO zn,man,count,lt
local next10,next11,my11,my12,go,
;вывод целой части
cmp zn,2Dh ;zn = '-' ?
jne next11 ;нет - дальше
mov al,zn ;выводим
Out_Sym ;знак числа
next11:
mov cx,count-1 ;устанавливаем счётчик
mov di,0 ;устанавливаем индекс
my12:
cmp man[di],'0'
;находим первую ненулевую