Виконання арифметичних операцій над числами з фіксованою комою

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Мета: ознайомитися з командами арифметичних операцій, введенням даних з клавіатури і виведенням даних на екран.
Завдання: написати програму введення з клавіатури двох чисел в 9-річної системі числення розміром з слово, виконання над ними розподілу та виведення результату у вихідній системі числення. Програма повинна передбачати контроль введеної інформації, контроль діапазону чисел і результату операції (переповнення, неможливість поділу).
Програма:
;----------- ЛАБОРАТОРНА РОБОТА № 3
. MODEL SMALL
. STACK 100H
.186
. DATA
S1 DB 'ВВЕДІТЬ ДЕЛІМ У ДЕВЯТІРІЧНОЙ СИСТЕМІ'
DB 'числення (від -48848 ДО 1О8806):', 10,13, '$'
S2 DB 'ВВЕДІТЬ Дільник у ДЕВЯТІРІЧНОЙ СИСТЕМІ'
DB 'числення (від -48848 ДО 1О8806):', 10,13, '$'
S3 DB 'Невірний запис ЧИСЛА У ДЕВЯТІРІЧНОЙ'
DB 'Система числення із заданого діапазону .','$'
S4 DB 'РОЗПОДІЛ НЕМОЖЛИВО: дільник дорівнює нулю .','$'
S5 DB 'РОЗПОДІЛ НЕМОЖЛИВО: дільники БІЛЬШЕ ДЕЛІМ .','$'
S6 DB 'ЗАЛИШОК:', 10,13, '$'
S7 DB 'ПРИВАТНЕ:', 10,13, '$'
L DB '48848 '; МІНІМАЛЬНА КІЛЬКІСТЬ
H DB '108806 '; МАКСИМАЛЬНИЙ ЧИСЛО
SX DB 12 DUP ('x'); ДЕЛІМ
SY DB 12 DUP ('y'); ДІЛЬНИКИ
SZ DB 8 DUP ('0'),'$'; ПРИВАТНЕ
. CODE
BEGIN: MOV AX, @ DATA
MOV DS, AX
;----------- ОЧИЩЕННЯ буфер клавіатури
START: CLI; заборони переривань
SUB AX, AX
MOV ES, AX
MOV AL, ES: [41AH]
MOV ES: [41CH], AL
STI; Дозвіл переривання
;----------- ОЧИЩЕННЯ ЕКРАНУ
CLD
MOV AX, 0B800H
MOV ES, AX
MOV DI, 0
MOV AL , 32
MOV AH, 7
MOV CX, 2000
REP STOSW
;----------- УСТАНОВКА курсор в лівий верхній кут екрану
MOV AH, 2; НОМЕР ФУНКЦІЇ
MOV BH, 0; НОМЕР СТОРІНКИ
MOV DH, 0; РЯДОК
MOV DL, 0; стовпець
INT 10H; позиціонування курсору
;----------- ВИСНОВОК ЗАПРОШЕННЯ ВВЕДЕННЯ ДЕЛІМ
LEA DX, S1
MOV AH, 9
INT 21H
;----------- ВВІД ДЕЛІМ
LEA DX, SX
MOV BX, DX
MOV [BX], BYTE PTR 9; ПЕРЕДБАЧУВАНА ДОВЖИНА РЯДКИ
MOV AH, 0AH
INT 21H
;----------- Встановлення курсору
MOV AH, 2; НОМЕР ФУНКЦІЇ
MOV BH, 0; НОМЕР СТОРІНКИ
MOV DH, 2; РЯДОК
MOV DL, 0; стовпець
INT 10H; позиціонування курсору
;----------- Перевірку правильності введення ДЕЛІМ
LEA DX, SX
MOV BX, DX
CALL CONTROL; перевірку правильності введення
MOV AL, [BX]
CMP AL, 0 "
JE ZERO1; ЧИСЛО НАДАНО НЕВІРНО
JMP NEAR PTR DELITEL
ZERO1: LEA DX, S3
MOV AH, 9
INT 21H
;=========== Очікування натискання клавіші
MOV AH, 7
INT 21H
JMP NEAR PTR START
;----------- ВИСНОВОК ЗАПРОШЕННЯ ВВЕДЕННЯ ДІЛЬНИКИ
DELITEL: LEA DX, S2
MOV AH, 9
INT 21H
;----------- ВВІД ДІЛЬНИКИ
INPUT: LEA DX, SY
MOV BX, DX
MOV [BX], BYTE PTR 9; ПЕРЕДБАЧУВАНА ДОВЖИНА РЯДКИ
MOV AH, 0AH
INT 21H
;----------- Встановлення курсору
MOV AH, 2; НОМЕР ФУНКЦІЇ
MOV BH, 0; НОМЕР СТОРІНКИ
MOV DH, 4; РЯДОК
MOV DL, 0; стовпець
INT 10H; позиціонування курсору
;----------- Перевірку правильності введення ДІЛЬНИКИ
LEA DX, SY
MOV BX, DX
CALL CONTROL; перевірку правильності введення
CMP [BX], BYTE PTR "0"
JE ZERO2; ЧИСЛО НАДАНО НЕВІРНО
JMP NEAR PTR OK
ZERO2: LEA DX, S3
MOV AH, 9
INT 21H
;=========== Очікування натискання клавіші
MOV AH, 7
INT 21H
;----------- ОЧИЩЕННЯ буфер клавіатури
CLI
SUB AX, AX
MOV ES, AX
MOV AL, ES: [41AH]
MOV ES: [41CH], AL
STI
;----------- ОЧИЩЕННЯ ЕКРАНУ
CLD
MOV AX, 0B800H
MOV ES, AX
MOV DI, 480
MOV AL , 32
MOV AH, 7
MOV CX, 480
REP STOSW
;----------- Встановлення курсору
MOV AH, 2; НОМЕР ФУНКЦІЇ
MOV BH, 0; НОМЕР СТОРІНКИ
MOV DH, 3; РЯДОК
MOV DL, 0; стовпець
INT 10H; позиціонування курсору
JMP NEAR PTR INPUT
;----------- Встановлення курсору
OK: MOV AH, 2; НОМЕР ФУНКЦІЇ
MOV BH, 0; НОМЕР СТОРІНКИ
MOV DH, 4; РЯДОК
MOV DL, 0; стовпець
INT 10H; позиціонування курсору
;----------- ПЕРЕВІРКА МОЖЛИВОСТІ РОЗПОДІЛУ
LEA BX, SX
CALL CTRL0
MOV AH, [BX]
LEA BX, SY
CALL CTRL0
MOV AL, [BX]
CMP AL , "0"
JE NULL
JMP N_NULL
;----------- Дільник дорівнює нулю
NULL: LEA DX, S4
MOV AH, 9
INT 21H
JMP NEAR PTR ENDPROG
;----------- ДІЛЬНИКИ не дорівнює нулю
N_NULL: CMP AH, 0 "
JNE DELENIE
;----------- ДЕЛІМ ОДНО НУЛЮ
LEA DX, S7
MOV AH, 9
INT 21H
LEA BX, SZ
MOV [BX], BYTE PTR "0"
INC BX
MOV [BX], BYTE PTR 10
INC BX
MOV [BX], BYTE PTR 13
INC BX
MOV [BX], BYTE PTR '$'
LEA DX, SZ
MOV AH, 9
INT 21H
LEA DX, S6
MOV AH, 9
INT 21H
LEA DX, SZ
MOV AH, 9
INT 21H
JMP NEAR PTR ENDPROG
;----------- Діленого і дільника не дорівнює нулю
DELENIE: LEA SI, SX
LEA DI, SY
CALL COMPARE
CMP [SI], BYTE PTR 1
JE POSSIBLE
;----------- ДІЛЬНИКИ БІЛЬШЕ ДЕЛІМ
LEA DX, S5
MOV AH, 9
INT 21H
JMP NEAR PTR ENDPROG
;----------- РОЗПОЧИНАЄТЬСЯ ПОДІЛ
POSSIBLE: MOV BX, 7; BX - ІНДЕКС ДЛЯ ПРИВАТНОГО
;----------- У СХ - ЧИСЛО РОЗРЯДІВ ДІЛЬНИКИ
AGAIN: MOV CL, SY [1]; CX - ЧИСЛО РАЗРАДОВ ДІЛЬНИКИ
MOV CH, 0
;----------- DI - НА МОЛОДШИЙ РОЗРЯД ДІЛЬНИКИ
MOV DI, CX; DI - ІНДЕКС ДЛЯ ДІЛЬНИКИ
INC DI
;----------- ВИДАЛЕННЯ провідних нулів ДІЛЬНИКИ
MOV SI, 2; SI - ІНДЕКС для подільних
MOV AL, SY [SI]
CMP AL , '-'
JNE BEFORE_C1
INC SI
DEC CX
BEFORE_C1: MOV AL, SY [SI]
CMP AL , "0"
JE SS1
JMP LBLL
SS1: INC SI
DEC CX
JMP BEFORE_C1
;----------- SI - НА МОЛОДШИЙ РОЗРЯД ДЕЛІМ
LBLL: MOV AL, SX [1]
CBW; АН - ДЛЯ ЗАПИСУ ПЕРЕНОСУ
MOV SI, AX
INC SI
;----------- ПОЧАТОК ЦИКЛУ РОЗПОДІЛУ
;=========== ПОРІВНЯННЯ ЦИФР РОЗРЯДУ діленого і дільника
C1: MOV AL, SX [SI]
CMP AL, SY [DI]
JAE NEXT
;=========== ЦИФРА ДЕЛІМ МЕНШЕ ЦИФРИ ДІЛЬНИКИ
ADD AL, 9; Позика ОДИНИЦІ
SUB AL, SY [DI]; Віднімання
ADD AL, "0"; ПЕРЕКЛАД ЦИФРИ У ЇЇ КОД
SUB AL, AH; Віднімання ПЕРЕНОСУ
MOV SX [SI], AL; РЕЗУЛЬТАТ - НА МІСЦЕ РОЗРЯДУ ДЕЛІМ
MOV AH, 1; ЗАПИС Позика
JMP NEAR PTR DECREM; НА КІНЕЦЬ ЦИКЛУ
;=========== ЦИФРА ДЕЛІМ БІЛЬШЕ ЦИФРИ ДІЛЬНИКИ
NEXT: SUB AL, SY [DI]; Віднімання
SUB AL, AH; Віднімання ПЕРЕНОСУ
MOV AH, 0; позику немає
ADD AL, "0"; ПЕРЕКЛАД ЦИФРИ У ЇЇ КОД
MOV SX [SI], AL; РЕЗУЛЬТАТ - НА МІСЦЕ РОЗРЯДУ ДЕЛІМ
;----------- SI, DI - НА ПОНАД СТАРШИЙ РОЗРЯД
DECREM: DEC SI
DEC DI
LOOP C1; НА ПОЧАТОК ЦИКЛУ РОЗПОДІЛУ
;----------- БУВ Позика ЧИ НІ
CMP AH, 1
JNE SRAVN
;----------- Позика була
AGAIN1: CMP SX [SI], "0"; ПОРІВНЯННЯ ЦИФРИ РОЗРЯДУ з нулем
JE C2
DEC SX [SI]
JMP SRAVN
;----------- ЦИФРА РОЗРЯДУ ДІЛЬНИКИ дорівнює нулю
C2: MOV SX [SI], '8 '
DEC SI; НА ПОНАД СТАРШИЙ РОЗРЯД
JMP AGAIN1; НА ПОРІВНЯННЯ ЦИФРИ РОЗРЯДУ з нулем
;=========== ФОРМУВАННЯ ПРИВАТНОГО
;----------- ЧИ Є ПЕРЕНЕСЕННЯ ПРИ ЗБІЛЬШЕННЯ ПРИВАТНОГО НА ОДИНИЦЮ
SRAVN: CMP SZ [BX], '8 '
JE PERENOS
;----------- ПЕРЕНОСУ НІ
ADD SZ [BX], 1; ЗБІЛЬШЕННЯ ПРИВАТНОГО НА ОДИНИЦЮ
MOV BX, 7; ВХ - НА МОЛОДШИЙ РОЗРЯД
JMP DEL; НА ПОРІВНЯННЯ діленого і дільника
;----------- ПЕРЕНЕСЕННЯ Є
PERENOS: MOV SZ [BX], "0"; В ДАНИЙ РОЗРЯД - НУЛЬ
DEC BX; ЗБІЛЬШЕННЯ РОЗРЯДУ
JMP SRAVN; НА ПОРІВНЯННЯ РОЗРЯДУ С "8"
;=========== ПОРІВНЯННЯ діленого і дільника
DEL: LEA SI, SX
LEA DI, SY
CALL COMPARE
MOV AL, [SI]
CMP AL, 1
JNE QUIT; РОЗПОДІЛ ЗАВЕРШЕНО
JMP NEAR PTR AGAIN; РОЗПОДІЛ ТРИВАЄ
;----------- ВИЗНАЧЕННЯ ЗНАКУ ПРИВАТНОГО
QUIT: MOV AH, SX [2]
MOV AL, SY [2]
;----------- З'ЯСУВАННЯ ЗНАКА ДЕЛІМ
CMP AH, '-'
JE SX_
JMP N_SX_
;----------- ДЕЛІМ - Негативно
SX_: CMP AH, AL; ПОРІВНЯННЯ ЗНАКА ДЕЛІМ і ділите
JE OUTP; НА ВИСНОВОК ЗАЛИШКУ
;----------- Дільник - ПОЗИТИВНИЙ
;=========== ВИДАЛЕННЯ провідних нулів У ПРИВАТНОМУ
SY_: MOV BX, 0
SRCH: CMP SZ [BX], "0"
JE DALEE
JMP STOP
DALEE: INC BX
JMP SRCH
;----------- ЗАПИС мінус перед старших розрядів ПРИВАТНОГО
STOP: DEC BX
MOV SZ [BX], '-'
JMP OUTP; НА ВИСНОВОК ЗАЛИШКУ
;----------- ДЕЛІМ ПОЗИТИВНЕ
N_SX_: CMP AL, '-'; ДІЛЬНИКИ НЕГАТИВНИЙ?
JE SY_; ПРИВАТНЕ ВІД'ЄМНОГО
;----------- ВИСНОВОК ПРИВАТНОГО
;=========== ВИСНОВОК ЗАЛИШКУ
;----------- ВИСНОВОК РЯДКИ "ЗАЛИШОК:"
OUTP: LEA DX, S6
MOV AH, 9
INT 21H
; ЗАПИС У КІНЕЦЬ ЗАЛИШКУ СИМВОЛІВ 10, 13 І "$"
MOV BH, 0
MOV BL, SX [1]
ADD BX, 2; ВХ - ЗА МОЛОДШИЙ РОЗРЯД
MOV SX [BX], 10
INC BX
MOV SX [BX], 13
INC BX
MOV SX [BX], '$'
;----------- ВИДАЛЕННЯ провідних нулів ЗАЛИШКУ
MOV AH, 0 "
LEA BX, SX; ВХ - ВКАЗУЄ НА ЗАЛИШОК
INC BX
INC BX
MOV AL, [BX]
CMP AL , '-'
JE MN
JMP N_MN
MN: MOV AH, '-'
INC BX
N_MN: MOV AL, [BX]
CMP AL , "0"
JE EQ1
JMP NEQ1
EQ1: INC BX
JMP N_MN
NEQ1: MOV AL, [BX]
DEC BX
CMP AL , 10
JE N_NUL
MOV [BX], AH
CMP AH, '-'
JE EQQ
JMP NEQQ
EQQ: MOV DX, BX
JMP LBL
NEQQ: INC BX
MOV AL, [BX]
CMP AL , 10
JE NUL
JMP N_NUL
NUL: DEC BX
N_NUL: MOV DX, BX
LBL: MOV AH, 9
INT 21H
;=========== ВИСНОВОК ПРИВАТНОГО
LEA DX, S7
MOV AH, 9
INT 21H
LEA BX, SZ
Q: MOV AL, [BX]
CMP AL , "0"
JE SM3
JMP OUTPUT
SM3: INC BX
JMP Q
OUTPUT: MOV DX, BX
MOV AH, 9
INT 21H
;----------- ВИХІД ІЗ ПРОГРАМИ
ENDPROG: MOV AH, 4CH
INT 21H
;=========== ПРОЦЕДУРА CONTROL - ЧИСЛО ДЕВЯТІРІЧНОЕ?
CONTROL PROC
PUSHA; ЗБЕРЕЖЕННЯ Регістру в СТЕК
MOV BX, DX
INC BX
MOV AL, [BX]
MOV AH, 0
MOV CX, AX
;----------- ЧИ Є РЯДОК ПОРОЖНІЙ?
CMP AL, 0
JE ERR1; Є
;----------- ПЕРЕВІРКА ДОВЖИНИ РЯДКИ
CMP AL, 6
JA ERR1; ЧИСЛО НАДАНО НЕВІРНО
INC BX
MOV AH, [BX]
CMP AH, '-'
JE MINUS
JMP NEAR PTR FOR1
MINUS: INC BX; число негативних
DEC CX
;----------- Введене число ДЕВЯТІРІЧНОЕ?
FOR1: MOV AH, [BX]
CMP AH, '9 '
JB N1
ERR1: JMP NEAR PTR ERROR; ЧИСЛО НАДАНО НЕВІРНО
N1: CMP AH, 0 "
JB ERR1; ЧИСЛО НАДАНО НЕВІРНО
INC BX
LOOP FOR1
MOV [BX], BYTE PTR '$'; ДЛЯ ВИВЕДЕННЯ РЯДКИ
CMP AL, 6
JNE RETURN; ЯКЩО ДОВЖИНА ЧИСЛА МЕНШЕ 6
MOV BX, DX
INC BX
MOV AH, 0
MOV CX, AX
INC BX
MOV AH, [BX]
CMP AH, '-'
JE M1; число негативних
LEA DI, H; ЧИСЛО ПОЗИТИВНЕ
JMP FOR2
M1: INC BX
DEC CX
LEA DI, L
; ВХОДИТЬ ЧИ числа в заданому ДІАПАЗОН?
FOR2: MOV AH, [BX]
CMP AH, [DI]
JA ERROR; ЧИСЛО НАДАНО НЕВІРНО
JB RETURN; ЧИСЛО НАДАНО ПРАВИЛЬНО
INC BX
INC DI
LOOP FOR2
JMP RETURN
ERROR: MOV BX, DX
MOV [BX], BYTE PTR "0"
RETURN: POPA; ВІДНОВЛЕННЯ РЕГІСТР
RET
CONTROL ENDP
;=========== ПРОЦЕДУРА CTRL0 - ЦЕ НУЛЬ?
CTRL0 PROC
PUSHA
MOV SI, 1
MOV CL, [BX + SI]
MOV CH, 0
INC SI
MOV AL, [BX + SI]
CMP AL , '-'
JE MIN
JMP CYCLE
MIN: INC SI
DEC CX
CYCLE: MOV AL, [BX + SI]
CMP AL , "0"
JNE FINISH
INC SI
LOOP CYCLE
MOV SI, 0
MOV AL , "0"
MOV [BX + SI], AL
FINISH: POPA
RET
CTRL0 ENDP
;=========== ПРОЦЕДУРА COMPARE - ПОРІВНЯННЯ ДВОХ ЧИСЕЛ
COMPARE PROC
PUSHA
INC SI
INC DI
MOV AH, [SI]
MOV AL, [DI]
INC SI
INC DI
CMP BYTE PTR [SI], '-'
JE NEGAT1
JMP POZIT1
NEGAT1: DEC AH
INC SI
POZIT1: CMP BYTE PTR [DI], '-'
JE NEGAT2
JMP POZIT2
NEGAT2: DEC AL
INC DI
POZIT2: MOV BL, [SI]
CMP BL, "0"
JE SM
JMP DI0
SM: INC SI
DEC AH
JMP POZIT2
DI0: MOV BL, [DI]
CMP BL, "0"
JE SM1
JMP SRAV1
SM1: INC DI
DEC AL
JMP DI0
SRAV1: CMP AH, AL
JA ABOVE
JB BELOW
JMP EQUAL
ABOVE: LEA SI, SX
MOV [SI], BYTE PTR 1
JMP NEAR PTR END1
BELOW: LEA SI, SX
MOV [SI], BYTE PTR -1
JMP NEAR PTR END1
EQUAL: MOV CL, AL
MOV CH, 0
FOR3: MOV AH, [SI]
CMP AH, [DI]
JA ABOVE
JB BELOW
INC SI
INC DI
LOOP FOR3
JMP ABOVE
END1: POPA
RET
COMPARE ENDP
END BEGIN
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
19.9кб. | скачати


Схожі роботи:
Розробка програмного забезпечення для реалізації арифметичних операцій над комплексними числами
Лісп-реалізація математичних операцій над комплексними числами
Виконання арифметичних дій і строкових операцій
Особливості виконання основних арифметичних операцій в ЕОМ
Операція над множинами як основа навчання арифметичних дій над цілими невід`ємними
Методика роботи над простими задачами що розкривають конкретний зміст арифметичних дій
ЛИСП-реалізація основних операцій над нечіткими множинами
Виконання символьних операцій з многочленами
Методи і засоби виконання управлінських операцій
© Усі права захищені
написати до нас