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

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

ЧЕРКАСЬКИЙ  ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ

Кафедра системного проектування 
 
 
 
 
 

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

з дисципліни «Системне програмування та операційні системи» 
 
 
 
 
 
 
 

Перевірив          Виконав

ст. викладач       студент групи ІТПС-908

Бабенко В.Г.       Шевчук І.М.

_______________       _______________ 
 
 
 
 
 
 
 
 

Черкаси, 2010 р. 
Зміст

Вступ            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 рівень - програма виконує операції підсумовування і віднімання цілих чисел.

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

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

Варіант - 8

Кількість байтів в цілій  та дробовій частині  – 3

Спосіб зберігання числа в пам’яті - не упакований

 

1.   ЗАГАЛЬНІ ВІДОМОСТІ.

1.1.Формати числових даних.

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

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

    а) Число в двійковому форматі зберігається в пам'яті у вигляді одно- чи двохбайтового числа в доповняльному  коді.

    б) Число в двійково-десятковому  упакованому форматі зберігається в пам'яті у вигляді послідовності  байт. Послідовність цифр в байтах природна : в молодших байтах зберігаються старші цифри.

    В кожному байті зберігаються дві  двійково-кодовані десяткові цифри  в коді BCD(Binary-Coded Decimal)

Цифра Двійковий код Цифра Двійковий код
0

1

2

3

4

0000

0001

0010

0011

0100

5

6

7

8

9

0101

0110

0111

1000

1001

    Приклад запису 6-розрядного десяткового числа 653201 в пам'яті в коді BCD: 

1 байт 2 байт 3 байт  
6       5 3       2 0      1 десяткове представлення
0110 0101 0011 0010 0000 0001 двійкове представлення
 

    в) Число в двійково-десятковому неупакованому форматі зберігається у вигляді послідовності байтів. В кожному байті зберігається одна двійково-кодована десяткова цифра. ±ї значення міститься в чотирьох молодших бітах байта.

    Перед виконанням операції множення таких чисел в старших чотирьох бітах повинні бути записані нулі. Для операції додавання і віднімання зміст цих біт не є суттєвим.

    Приклад запису 3-розрядного десяткового числа 653 в пам`яті в двійково-десятковому  неупакованому форматі: 

1 байт 2 байт 3 байт  
0      6 0     5 0     3 десяткове представлення
0000 0110 0000 0101 0000 0011 двійкове представлення

1.2. Виконання арифметичних операцій.

    Процесори IBM PC мають в системі команд такі команди, які дозволяють виконувати арифметичні операції додавання, віднімання, множення і ділення над цілими числами в двійковому форматі, а також в двійково-десятковому упакованому і неупакованому форматах.

1.2.1. Арифметичні команди над двійковими цілими числами.

1.2.1.1. Для виконання додавання цілих двійкових чисел можуть використовуватись команди:

      ADD a,b - Додавання без урахування  перенесення. Команда додає значення  двох операндів а та b, і розміщує  результат замість першого операнда. Операнд може знаходитися в пам'яті, в регістрі, або бути безпосереднім параметром в команді. Не допускається додавання двох операндів, які находяться в пам'яті. Першим операндом не може бути безпосередній параметр. Установлюються прапори AF,CF,OF,FF,SF,ZF.

      ADC a,b - Додавання з перенесенням. Команда  додає значення двох операндів,  а також значення прапора перенесення CF (a+b+CF), і розміщує результат замість першого операнда. Обмеження на операнді такі ж, як і в команді ADD. Установлюються прапори AF,CF,OF,FF,SF,ZF. Ця команда використовується для програмування арифметичних операцій над довгими цілими числами.

    INC a - Збільшення на 1. Команда додає  1 до значення операнда а. Операнд  може находитися в пам'яті або в

      регістрі. Установлюються прапори AF,OF,PF,SF,ZF.

1.2.1.2. Для виконання віднімання можуть бути використані команди:

      SUB a,b - Віднімання. Команда віднімає із значення першого операнда а значення другого операнда b і розміщує результат замість першого операнда. Операнд може находитися в пам'яті, в регістрі, або бути безпосереднім параметром в команді. Не допускається віднімання, коли обидва операнда находяться в пам'яті. Першим операндом не може бути безпосередній параметр. Установлюються прапори AF,CF,OF,PF,SF,ZF.

      SBB a,b - Віднімання з позикою. Команда  віднімає із значення першого  операнда а значення другого  операнда b, зменшує результат на значення прапора CF (a-b-CF) і розміщує результат замість першого операнда. Обмеження операндів такі ж, як і в команді SUB. Установлюються прапори AF,CF,OF,PF,SF,ZF.

    DEC a - Зменшування на 1. Команда зменшує  значення операнда а на 1. Операнд  може находитися в пам'яті

      або в регістрі. Установлюються прапори AF,OF,PF,SF,ZF.

1.2.1.3.Для виконання множення цілих двійкових чисел можуть бути використані команди:

    MUL a - Множення. Команда виконує множення  вмісту акумулятора (AL або AX) на  значення операнда а.

      Результат розміщується, відповідно, в акумуляторі AX, або в парі регістрів DX:AX. Множники розглядаються як числа без знаків. Установлюються прапори CF і OF. Прапори AF,PF,SF і ZF не визначені.

      IMUL a - Множення із знаком. Команда  виконує множення вмісту акумулятора (AL або AX) на значення операнда а. Результат розміщується, відповідно, в акумуляторі AX, або в парі регістрів DX:AX. Множники розглядаються як числа із знаками.

       Прапори CF і OF скидаються в 0, коли старша частина  добутку (регістр AH або DX) є поширенням знака, який находиться в молодшій частині добутку (AL або AX), інакше ці прапори установлюються в 1.

1.2.1.4.Для виконання ділення цілих двійкових чисел можуть використовуватися команди:

      DIV a - Ділення. Команда виконує ділення  вмісту акумулятора на операнд a. Коли операнд а - байт, тоді ділене розміщується в AX, ціла частина розміщується в AL, а залишок - в AH. Коли операнд а - слово, тоді ділене розміщується в парі DX:AX (подвійне слово), ціла частина розміщується в AX, а залишок в DX. Операнд розглядаються як цілі числа без знака. При діленні на 0 виконується переривання типа 0.

      IDIV a - Ділення із знаком. Команда  виконує ділення операндів також,  як в команді DIV. Операнди розглядаються  як числа із знаками. Прапори  не визначені. При діленні на 0 виконується переривання типа 0.

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

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

     Слід  нагадати, що для зберігання однієї цифри такого числа треба один байт.

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

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

    ААА - Корекція результату додавання. Команда коригує результат операції ADD. В чотирьох молодших бітах регістра AL записується значення десяткової цифри, а в чотирьох старших бітах записуються нулі. Коли в AL результат попередньої операції перевищує 9, тоді CF=1 і AH=AH+1.

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

    AAM - Корекція в AX результату множення. Команда коригує результат операції MUL. В регістрі AH записується старша цифра добутку, а в AL - молодша цифра.

    AAD - Корекція ділення. Команда коригує ділене в регістрі AL перед виконанням ділення, так що наступне ділення DIV дає неупаковану десяткову частку: в AL - результат, в AH - нуль.

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'       ;находим первую ненулевую цифру

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