Реферат: Выполнение арифметических операций над числами с фиксированной запятой
Цель: ознакомиться скомандами арифметических операций, вводом данных с клавиатуры и выводом данныхна экран.
Задание: написатьпрограмму ввода с клавиатуры двух чисел в 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 PTRSTART
;-----------ВЫВОД ПРИГЛАШЕНИЯВВОДА ДЕЛИТЕЛЯ
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 PTRENDPROG
;-----------ДЕЛИТЕЛЬ НЕРАВЕН НУЛЮ
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 PTRENDPROG
;-----------ДЕЛИМОЕ ИДЕЛИТЕЛЬ НЕ РАВНЫ НУЛЮ
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 PTRENDPROG
;-----------НАЧИНАЕТСЯДЕЛЕНИЕ
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: MOVAL, 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 PTRFOR1
MINUS: INC BX; ЧИСЛО ОТРИЦАТЕЛЬНОЕ
DEC CX
;-----------ВВЕДЕННОЕЧИСЛО ДЕВЯТИРИЧНОЕ?
FOR1: MOV AH,[BX]
CMP AH, '9'
JB N1
ERR1: JMP NEARPTR 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 BYTEPTR [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 PTREND1
BELOW: LEA SI,SX
MOV [SI],BYTE PTR -1
JMP NEAR PTREND1
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