Модель арифметико-логічного пристрою
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ
ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ
Кафедра
системного проектування
Курсова робота
з дисципліни
«Системне програмування та операційні
системи»
Перевірив Виконав
ст. викладач студент групи ІТПС-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 - Додавання без урахування
перенесення. Команда додає
ADC
a,b - Додавання з перенесенням. Команда
додає значення двох операндів,
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 - Ділення. Команда виконує
IDIV
a - Ділення із знаком. Команда
виконує ділення операндів
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 '
Курсовая работа по дисциплине:
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'
;находим первую ненулевую

- Модель банковского обслуживания
- Модель Блэка-Шоулза для оценки европейских опционов. Простейшие схемы опционного хеджирования
- Модель Большого Взрыва
- Модель Большого Взрыва и хронология Вселенной
- Модель взаимодействия двух популяций
- Модель взаимодействия открытых систем OSI.Механизмы обеспечения безопасности на разных уровнях модели OSI
- Модель взаимодействия учреждений культуры в проведении массовых праздников
- Модель IS-LM: сочетание различных налогово-бюджетных рычагов
- Модель LS-LM
- Модель Okumura-Hata
- Модель PIMS
- Модель Абернаси-Аттербек и модель Барраса: динамика инновационного процесса в туризме
- Модель альтернативных издержек и другие методы решения проблемы экономического выбора
- Модель арбитражного ценообразования