Материал: 775

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

NAMEFLD_d db 12 dup(' ')

binval_b dw 0 binval_w dw 0 binval dd 0 binval_d dw 0

dw 0

ASCVAL db '00000000000000000000','$' kol dd 0

LN db 0 DEL dd 0

SOOB2 db 'ВВЕДИТЕ B1 ','$' SOOB3 db 'ВВЕДИТЕ B2 ','$' SOOB4 db 'ВВЕДИТЕ B3 ','$' SOOB5 db 'ВВЕДИТЕ B13 ','$' SOOB6 db 'ВВЕДИТЕ B16 ','$' SOOB7 db 'ВВЕДИТЕ W1 ','$' SOOB8 db 'ВВЕДИТЕ W2 ','$' SOOB11 db 'ВВЕДИТЕ D1 ','$'

SOOB13 db 'ВВЕДИТЕ B13 ','$' SOOB14 db 'ВВЕДИТЕ W13 ','$' SOOB15 db 'ВВЕДИТЕ W19 ','$' SOOB16 db 'ВВЕДИТЕ B16 ','$' SOOB17 db 'ВВЕДИТЕ W21 ','$'

;SOOBASK db 'Ещё раз вычислять будем ? Если да, нажмите "1"',0ah,0dh,'$'

STRERR1 db 'ПЕРЕПОЛНЕНИЕ! Больше 127. Введите cнова.',0AH,0DH,'$' STRERR2 db 'ПЕРЕПОЛНЕНИЕ! Больше 32767. Введите снова.',0AH,0DH,'$' STRERR3 db 'ПЕРЕПОЛНЕНИЕ! Больше 2147483647. Введите снова.',0AH,0DH

db '$'

 

 

 

mult10 dw 1

 

 

 

DATASG ENDS

 

;конец сегмента данных

CODESG SEGMENT PARA 'Code'

; начало сегмента кода

BEGIN PROC FAR

 

 

; главная процедура

ASSUME

CS:CODESG,DS:DATASG,SS:STACSG

GLOBAL

BEGIN:FAR

 

PUSH DS

 

; записать DS в стек

XOR

AX,AX

; установить ноль в AX

PUSH AX

 

; записать ноль в стек

MOV AX,DATASG

; занести в адрес

MOV DS,AX

 

; DATASG в DS

; текст программы :

 

 

 

MOV LN,1

 

 

mov

ax,0600h

;очистка экрана

mov

bh,011

 

 

 

 

 

71

mov

cx,0000

mov

dx,184fh

int

10h

;

CALL STROKA

 

 

CALL HIMESS

 

ENTFNUM: CALL ENTX

;ВВОД И ПРЕОБРАЗОВАНИЕ Х

 

MOV MAXLEN_b,4

 

MOV WORD PTR NAMEFLD_b, 2020h

 

CMP

X,1

 

 

JNZ

F34

 

 

CALL ENTB1

;ВВОД И ПРЕОБРАЗОВАНИЕ B1

 

CALL ENTB2

;ВВОД И ПРЕОБРАЗОВАНИЕ B2

 

CALL ENTB3

;ВВОД И ПРЕОБРАЗОВАНИЕ B3

 

CALL ENTW1

;ВВОД И ПРЕОБРАЗОВАНИЕ W1

 

CALL ENTW2

;ВВОД И ПРЕОБРАЗОВАНИЕ W2

 

CALL ENTD1

;ВВОД И ПРЕОБРАЗОВАНИЕ D1

 

CALL FORM1

;ВЫЗОВ ВЫЧИСЛЕНИЙ

 

JMP

RGN

 

F34:

CMP

X,34

 

 

JNZ

F35

 

 

CALL ENTW1

 

 

CALL ENTW2

 

 

CALL FORM34

 

 

JMP

RGN

 

F35:

CMP

X,35

 

 

JNZ

F49

 

 

CALL ENTW1

 

 

CALL ENTW2

 

 

CALL FORM35

 

 

JMP

RGN

 

F49:

CMP

X,49

 

 

JNZ

F57

 

 

CALL ENTW13

 

 

CALL ENTB13

 

 

CALL FORM49

 

 

JMP

RGN

 

F57:

CMP

X,57

 

 

JNZ

F62

 

 

CALL ENTW19

 

 

CALL ENTB16

 

 

CALL FORM57

 

 

JMP

RGN

 

F62:

CMP

X,62

 

 

JNZ

FERR

 

 

CALL ENTW21

 

 

CALL ENTW2

 

 

CALL FORM62

 

 

 

 

72

 

JMP

RGN

 

 

FERR:

MOV

AH,09h

 

 

 

LEA

DX,soobformnumerr

 

INT

21h

 

 

 

CALL STROKA

 

 

 

JMP

ENTFNUM

 

RGN:

call

BIN2ASC ;ВЫЗОВ ПРЕОБРАЗОВАНИЯ ИЗ BIN В ASCII

 

NOP

 

 

 

 

NOP

 

 

 

 

NOP

 

 

 

 

NOP

 

 

 

 

NOP

 

 

 

 

NOP

 

 

 

 

NOP

 

 

 

 

NOP

 

 

 

 

mov

ah,9

;\

 

 

lea

dx,ascval ; вывод на экран результата

 

int

21h

;/

 

 

mov

ah,02

;\

| установка курсора

 

mov

bh,00

; \

| экран 0

 

mov

dh,24

; управление курсором | строка 23

 

mov

dl,00

; /

| столбец 00

 

int

10h

;/

| передача упр. в BIOS

 

mov

ah,09

 

 

 

lea

dx,soob_vixod

 

 

int

21h

 

 

 

mov

ah,0

;–ожидание нажатия клавиши

 

int

16h

;/

 

 

RET

 

 

;передача управления в DOS

BEGIN ENDP

 

;конец главной процедуры

HIMESS PROC

 

 

 

 

CALL

stroka

 

 

MOV

AH,09

 

; вывод на экран

 

LEA

DX,SOOB1

; заслать в DX адрес SOOB1

 

INT

21h

 

 

 

call

stroka

 

 

;

MOV

AH,09

 

; вывод на экран

 

LEA

DX,SOOBFORM1 ; заслать в DX адрес SOOBFORM

 

INT

21h

 

; прерывание (передача управления в BIOS)

 

CALL STROKA

 

 

 

LEA

DX,SOOBFORM34

 

 

INT

21h

 

 

 

CALL STROKA

 

 

 

LEA

DX,SOOBFORM35

 

 

INT

21h

 

 

 

CALL STROKA

 

 

 

 

 

 

73

LEA

DX,SOOBFORM49

INT

21h

CALL STROKA

LEA

DX,SOOBFORM57

INT

21h

CALL STROKA

LEA

DX,SOOBFORM62

INT

21h

CALL STROKA RET

HIMESS ENDP

;*************************************************************************** ;ПРОЦЕДУРА ВЫЧИСЛЕНИЯ ПО ФОРМУЛЕ B1*B2*B3-D1/B3+W1+W2 ;***************************************************************************

FORM1 PROC

 

 

;ВЫЧИСЛЕНИЕ W1+W2:

 

XOR

DX,DX

;DX=0

MOV AX,W1

;AX=W1

ADD

AX,W2

;AW=AX+W2=W1+W2

ADC

DX,0

;DX=DX+0+CF

 

 

;(DX:AX)-РЕЗУЛЬТАТ W1+W2

MOV WORD PTR REZULT, AX

MOV WORD PTR REZULT+2, DX ;ЗАНОСИМ РЕЗУЛЬТАТ В REZ

; ВЫЧИСЛЕНИЕ B1*B2*B3

 

MOV AL,B1

;AL=B1

MUL

B2

;AX=AL*B2=B1*B2

MOV BL,B3

;BL=B3

XOR

BH,BH

;BX=BL=B3

MUL

BX

;(DX:AX)=AX*BX=B1*B2*B3

MOV WORD PTR RES, AX

 

MOV WORD PTR RES+2, DX

;ПЕРЕНОСИМ РЕЗУЛЬТАТ В RES

;ВЫЧИСЛЯЕМ D1/B3

 

 

MOV AX,WORD PTR D1

 

MOV DX,WORD PTR D1+2

 

MOV BL,B3

 

 

XOR

BH,BH

 

 

DIV

BX

;(DX:AX)/BX

 

 

 

;ЧАСТНОЕ В AX, ОСТАТОК В DX

;ИЛИ DIV BL

 

;AX/BL

MOV RES1W,AX

;ЧАСТНОЕ В AL, ОСТАТОК В AH

 

 

;ВЫЧИСЛЯЕМ RES(B1*B2*B3) - D1/B3

 

MOV AX,WORD PTR RES

 

MOV DX,WORD PTR RES+2

;(DX:AX)=RES

 

 

74

 

 

SUB

AX,RES1W

;AX=AX+RES1W

 

SBB

DX,0

;DX=DX+0+CF

 

 

;(DX:AX)-РЕЗУЛЬТАТ RES+RES1W

;

MOV

WORD PTR RES,AX

 

 

;

MOV

WORD PTR RES+2,DX

 

 

;ВЫЧИСЛЯЕМ REZ + (W1+W2)

 

 

 

ADD

AX,WORD PTR REZULT

 

 

 

ADC

DX,WORD PTR REZULT+2

;ПРИБАВЛЯЕМ К (AX:DX) ;

 

 

 

 

REZULT Т.Е. W1+W1

 

MOV WORD PTR REZULT,AX ;ЗАНОСИМ РЕЗУЛЬТАТ В RESULT

MOV WORD PTR REZULT+2,DX

; РЕЗУЛЬТАТ ВЫЧИСЛЕНИЙ ХРАНИТСЯ В REZULT (ДВОЙНОЕ СЛОВО)

RET FORM1 ENDP

;*************************************************************************** ;ВВОД И ПРЕОБРАЗОВАНИЕ НОМЕРА ФОРМУЛЫ (ЧИСЛА X)

;***************************************************************************

ENTX PROC XB:

 

mov

ah,09

 

; вывод приглашения

 

lea

dx,SOOBFORMNUM

 

int

21h

 

 

 

mov

ah,0Ah

 

; ввод с клавиатуры значения X

 

lea

dx,NAMEPAR_b

 

 

int

21h

 

 

 

CALL STROKA

 

 

 

call

ASC2BIN_BYTE

;перевод из ASCII B BIN

 

xor

ax,ax

 

;переносим переведённый байт в X

 

mov

al,byte ptr binval_b

 

 

mov

X,al

 

 

;

mov

al,b1

 

;В1 сравниваем с 127

;

cmp

al,127

 

 

;

ja

XM

 

;если >, то на метку osi

XM:

jmp

XE

 

;если <= , то на метку www

mov

ah,09

 

;вывод на экран

 

 

 

lea

dx,STRERR1

 

;сообщения об ошибке

 

int

21h

 

 

XE:

jmp

XB

;переход на QQ1

RET

 

 

 

 

 

 

 

ENTX ENDP

;==================================================================

;ПРОЦЕДУРА ПЕРЕВОДА ИЗ ДВОИЧНОГО В ASCII

;(исправлено для перевода двойного слова...)

;чтобы перевести учетверенное, надо раскомментировать строчки

;==================================================================

75

Источник: https://studfile.net/preview/16406832/