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

Цель: ознакомиться скомандами арифметических операций, вводом данных с клавиатуры и выводом данныхна экран.

Задание: написатьпрограмму ввода с клавиатуры двух чисел в 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

еще рефераты
Еще работы по информатике, программированию