Автор: Пользователь скрыл имя, 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
je my11 ;если 0, то ищем дальше
jmp next10 ;если не 0, то выводим число
my11:
inc di ;ищем индекс первой выводимой цифры
cmp di,lt ;если кол-во обработанных знаков
je go ;равно кол-ву их в целой части
loop my12
go: mov al,'0' ;выводим 0
Out_Sym
go1: mov al,'.' ;выводим .
Out_Sym
next10:
mov al,man[di] ;собственно вывод
Out_Sym ;целой части числа
inc di
cmp di,lt
je go1
loop next10
finOpOut:
ENDM Op_Out
;ввод числа
Op_In MACRO zn,man
local @113,@114,vvod1,vvodM,chb,
vvod1:
Set_Kur 01,00
Scr_out about2
Set_Kur 10,00
cmp lop,1
jne chb
scr_out mes3
jmp nach
chb:
scr_out mes4
nach: mov zn,2Bh ;zn = '+' изначально
Nul man,12
mov fl,0
mov flag,0
mov m,0
mov m,0
;количество целых символов
vvodM:
mov ah,08 ;ввод символа с клавиатуры
int 21H
cmp al,2bh
jne next1
mov zn,2bh
mov flag,0
out_sym
cmp al,2Dh ;символ - '-' ?
jne next1 ;нет - дальше
cmp m,0 ;число цифр целой части = 0 ?
jne next1 ;нет - дальше
cmp flag,0
jne next1
mov zn,2dh ;да - zn='-'
mov flag,1
Out_Sym ;вывод символа
jmp vvodM ;ввод следующего символа
next1:
cmp al,0Dh ;ENTER ?
jne next2 ;нет - дальше
cmp m,0
;колличество цифр в целой
jne met1 ;нет - на конец макроса
mov al,'0'
Out_Sym
met1: jmp finOpIn
next2:
cmp al,'.' ;'.' ?
jne next3 ;нет-дальше
cmp fl,0 ;была ли нажата раньше
jne next3 ;да-дальше
cmp m,0 ;если кол-во введеных знаков равно 0
jne tochka
mov al,'0' ;то выводим сначала 0 перед точкой
out_sym
tochka:
set_kur 22,20
scr_out varn4
set_kur 10,28
mov al,'.' ;выводим точку
out_sym
mov m,5 ;так как нажата точка
mov fl,1 ;кол-во введеных знаков равно 6 и установка флага
jmp vvodm
next3:
cmp al,1bh ;проверка на ESC
jne next4 ;нет-дальше
end_task ;выход из программы
next4:
cmp al,30h ;проверка на то
jb @113 ;была ли нажата
cmp al,39h ;цифра или нечто
ja @113 ;другое
jmp @114
@113:
jmp vvodm
@114:
cmp m,3
jae met2 ;кол-во введеных знаков>=3
out_sym ;нет-выводим символ
mov cx,4 ;и начинаем здвиг
mov di,1
left:
mov dh,man[di] ;сдвиг целой части
mov man[di-1],dh ;на 4 разрядов
inc di ;влево
loop left
mov man[4],al ;заносим очередную цифру мантиссы в конец
jmp met5
met2:
cmp fl,0
jne met3 ;переполнение разрядной сетки в целой части
set_kur 22,20
scr_out varn1
set_kur 23,16
scr_out varn3
set_kur 10,28
jmp vvodm
met3:
cmp m,8 ;кол-во введеных знаков
jae met4 ;>8
Out_Sym
xor bx,bx
mov bl,m
mov man[bx],al ;заносим знак в мантису
jmp met5
met4:
set_kur 22,20
scr_out varn1
set_kur 23,17
scr_out varn2
jmp vvodm ;переполнение дробной части
met5:
inc m ;увеличение счетчика
jmp vvodm
finOpIn:
mov ah,02
mov bh,00
mov dh,15
mov dl,00
int 10h
Scr_Out vopros1 ;правильно ли ввели число
povtor:
pause
cmp al,79h ;y-?
jne met6
jmp allfinal
met6:
cmp al,6eh ;n-?
jne povtor
cls 0000,184Fh
jmp
vvod1
allfinal:
ENDM Op_In
;суммирование мантис
summa macro a,b,c
local sum
nul c,11 ;обнуление числа с
asc_dec a,10 ;приводим число a
asc_dec b,10 ;приводим число b
asc_dec c,11 ;приводим число c
mov cx,10 ;кол-во итераций
mov si,11 ;начинаем суммирование с младших разрядов
clc ;сброс флага cf
sum:
mov al,a[si] ;в al цифру из числа a
adc al,b[si] ;суммируем с учетом переноса с цифрой из числа b
aaa
;коррекция
mov c[si+1],al ;заносим результат
dec si ;уменьшаем si
loop sum ;cx=cx-1 if cx=0 then
mov c,0 ;в старший разряд числа c заносим 0
adc c,0 ;суммируем с учетом переноса c 0
dec_asc a,10 ;приводим a к выводу
dec_asc b,10 ;приводим b к выводу
dec_asc c,11 ;приводим c к выводу
ENDM summa
;отнимание мантис (1-ая больше 2-ой)
raznost macro a,b,c
local razn
nul c,11 ;обнуление числа с
asc_dec a,10 ;приводим число a
asc_dec b,10 ;приводим число b
asc_dec c,11 ;приводим число c
mov cx,10 ;кол-во итераций
mov si,11 ;начинаем отнимание с младших разрядов
clc ;сброс флага cf
razn:
mov al,a[si] ;в al цифру из числа a
mov bl,b[si] ;в bl цифру из числа b
sbb al,bl ;вычитаем с учетом заема
aas ;коррекция
mov c[si+1],al ;заносим результат
dec si ;уменьшаем si
loop razn ;cx=cx-1 if cx=0 then
dec_asc a,10 ;приводим a к выводу
dec_asc b,10 ;приводим b к выводу
dec_asc c,11 ;приводим c к выводу
endm raznost
mnog MACRO a,b
local mett,met,smm,final,a1,a2
nul manmnog,20 ;обнуление разультата умножения
asc_dec a,10 ;приводим число a
asc_dec b,10 ;приводим число b
asc_dec manmnog,20 ;приводим разультат умножения
mov lop,0 ;первоначальное смещение=0
mett:
nul manc,11
;обнуление промежуточного
asc_dec manc,11 ;приводим промежуточный результат
mov cx,10 ;кол-во итераций
mov si,9 ;начинаем умножение с младших разрядов
mov bh,0
;перенос из младших цифр
met:
mov al,a[si] ;в al цифру из числа a
xor di,di ;формируем
mov di,11 ;адрес
sub di,lop ;[11-lop]
mov dl,b[di] ;в bl цифру из числа b по адресу в di
mul dl ;умножение
aam ;коррекция