Модель арифметико-логічного пристрою

Автор: Пользователь скрыл имя, 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

Работа содержит 1 файл

Курсова робота варіант_8_неупак.doc

— 353.00 Кб (Скачать)

1.2.3. Арифметичні команди над двійково-десятковими упакованими числами

    Арифметичні операції над двійково-десятковими упакованими числами виконуються по байтах, тобто задана операція додавання або віднімання виконується одночасно над двома розрядами числа, які находяться в одному байті, починаючи з молодших розрядів.

    Виконання операції додавання або віднімання здійснюється в два етапу. Спочатку над цим байтом виконується, відповідно, команда додавання (ADD, ADC) або віднімання (SUB, SBB), а потім виконується корекція результату, щоб отримати правильні значення упакованих десяткових цифр.

    Для корекції результату використовуються такі команди:

    DAA - Корекція результату додавання. Команда коригує в AL результат операції ADD, ADC. В регістрі AL створюються дві правильні двійково-десяткові цифри результату. Коли виникає перенесення в наступний байт, тоді CF=1.

    DAS - Корекція результату віднімання. Команда коригує в AL результат операції SUB, SBB. В регістрі AL створюються дві правильні двійково-десяткові цифри результату. Коли виникає позика із наступного байта, тоді CF=1.

2. Блок-схема програми

2.1.Головна програма

2.2. Блок-схеми підпрограм

2.2.1. Обнулення числа                                   2.2.2. Приведення числа з символьного вигляду до числового

2.2.3. Приведення числа з числового вигляду до символьного                          2.2.4. Виведення числа на екран

2.2.5. Введення числа

         2.2.6. Додавання      2.2.7. Віднімання

                    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  
 
 
 
 

2.2.8 Множення

 
3. Опис роботи програми

3.1. Опис роботи головної програми

   При запуску програми на екрані з’являється вікно привітання з інформацією про автора, вікно тримається на екрані до натиснення будь-якої клавіші. Потім екран очищується з’являється інформаційна стрічка та стрічка для введення першого числа. При введенні цифр числа програма слідкує за введеними символами та дозволяє вводити тільки знаки ’+’ чи ’-’ , цифри або знак ’.’, спроби ввести які-небудь інші символи програма ігнорує. Якщо користувач не ввів знак числа, то числу буде автоматично присвоєно знак ’+’. Також програма слідкує за переповненням розрядної сітки і якщо воно виникає, то на екрані з’явиться відповідне повідомлення, після введення числа користувач повинен підтвердити правильність введеного числа або ввести число заново. Введення другого числа відбувається аналогічно.

Після введення чисел на екрані з’являється  табличка в якій виведено обидва числа  та результати виконання арифметичних операцій над ними, нижче буде виведена стрічка яка пропонує продовжити або закінчити виконання програми при натисненні клавіш Y або N відповідно.

      3.2. Опис виконання арифметичних операцій

 

Після введення числа передаються до підпрограм які виконують над мини операції додавання, віднімання та множення.

Спочатку  порівнюються числа без знаків, це потрібно для правильного виконання  операції віднімання, може виникнути  три варіанти виконання операцій:

A>B

A<B

A=B

Після цього порівнюються знаки чисел, при виникненні першої ситуації (A>B) операції додавання та віднімання не змінюють своїх параметрів, а операція множення  залежно від знаків чисел змінює знак добутку:

Якщо  знаки числа А та числа В  співпадають то знак добутку буде ’+’

Якщо  знаки  числа А та числа В не співпадають то знак добутку буде ’-’

При виникненні другого варіанту (A<B) спочатку з’ясовується чи однаковий знак вони мають, якщо так, то додавання виконується без змін, а при виникненні в числа А знаку ’+’ віднімання проходить в зворотному напрямку (В-А), а добутку присвоюється знак ’+’. Якщо обидва числа від’ємні, то операції проходять ідентично. Якщо знаки відрізняються, то віднімання проходить в зворотному напрямку (В-А), додавання –– в прямому (А+В), а добутку присвоюється знак ’-’.

При виникненні третього варіанту (А=В)  порівнюються знаки чисел, якщо знаки однакові, то додавання виконується без змін, різниці присвоюється нуль, а добутку присвоюється знак ’+’. Якщо знаки різні, то сумі присвоюється значення ’0’, різниці присвоюється значення суми (А+В), а добутку присвоюється знак ’-’.

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

 

4. Лістинг програми:

;по 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     '                        Курсовая работа по дисциплине:',13,10

          DB     '                         "Системное программирование"  ',13,10

          DB     '                       Выполнил:   студент ИТПС-908 ',13,10

          DB     '                                   Шевчук И.Н.     ',13,10,'$'

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     'Подтвердите правильность заданного  числа(y/n)','$'

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,go1,finOpOut

          ;вывод целой части

          cmp      zn,2Dh            ;zn = '-' ?

          jne      next11            ;нет - дальше

          mov      al,zn             ;выводим

          Out_Sym                    ;знак числа

next11:

          mov      cx,count-1        ;устанавливаем счётчик

          mov      di,0              ;устанавливаем индекс

my12:    

          cmp      man[di],'0'       ;находим первую ненулевую цифру

Информация о работе Модель арифметико-логічного пристрою