Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2591

.pdf
Скачиваний:
2
Добавлен:
07.01.2021
Размер:
25.15 Mб
Скачать

FAKTLEN_d db ?

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

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

 

 

 

71

mov bh,011 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

72

 

CALL FORM62

 

 

 

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

 

 

 

 

 

 

73

CALL STROKA

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

 

 

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

MOV RES1W,AX

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

MOV AX,WORD PTR RES

74

 

MOV DX,WORD PTR RES+2

 

;(DX:AX)=RES

 

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

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

BIN2ASC proc

lea si,ascval[19]

m1:

;cmp word ptr rezult[6],0

;jne m2

;cmp word ptr rezult[4],0

;jne m2

cmp word ptr rezult[2],0 jne m2

cmp word ptr rezult,10 jnb m2

mov ax,word ptr rezult or al,30h

mov [si],al dec si

jmp m3

m2: sub word ptr rezult,10 sbb word ptr rezult[2],0

;sbb word ptr rezult[4],0

;sbb word ptr rezult[6],0 add word ptr kol,1 adc word ptr kol[2],0

;adc word ptr kol[4],0

;adc word ptr kol[6],0

jmp m1

m3:

;cmp word ptr kol[6],0

;jne m4

;cmp word ptr kol[4],0

;jne m4

cmp word ptr kol[2],0 jne m4

cmp word ptr kol,0 jne m4

ret

m4:

mov ax,word ptr kol mov word ptr rezult,ax mov ax,word ptr kol[2] mov word ptr rezult[2],ax

;mov ax,word ptr kol[4]

;mov word ptr rezult[4],ax

;mov ax,word ptr kol[6]

;mov word ptr rezult[6],ax mov word ptr kol,0 mov word ptr kol[2],0

76

;mov word ptr kol[4],0

;mov word ptr kol[6],0

jmp m1 BIN2ASC endp

clrascval proc mov cx,20 mov si,19

clr1: and ascval[si],30h dec si

loop clr1 ret

clrascval endp

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

ASC2BIN_BYTE PROC

; процедура перевода из ASCII в bin для байта

MOV mult10,1

 

MOV BINVAL_B,0

 

XOR

AX,AX

 

XOR

DX,DX

 

MOV CX,10

; фактор умножения

LEA

SI,NAMEFLD_b – 1; адрес ASCVAL

MOV BL,FAKTLEN_b

; длина ASCVAL

MOV BH,0

 

A21:

 

 

MOV AL,[SI+BX]

; выбрать ASCII-символ

AND

AX,000FH

; очистить зону тройки

MUL

MULT10

; умножить на фактор 10

ADD

BINVAL_b,AX

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

MOV AX,MULT10

; вычислить следующий

MUL CX

; фактор умножения

MOV MULT10,AX

 

DEC

BX

; последний. ASCII-символ?

JNZ

A21

; нет – продолжить

ret

 

 

ASC2BIN_BYTE ENDP

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

ASC2BIN_WORD PROC

;процедура перевода из ASCII в bin для слова

 

MOV mult10,1

 

 

MOV BINVAL_W,0

 

XOR

AX,AX

 

XOR

DX,DX

 

MOV

CX,10

; фактор умножения

LEA

SI,NAMEFLD_w – 1

; адрес ASCVAL

MOV

BL,FAKTLEN_w

; длина ASCVAL

MOV

BH,0

 

B20:

 

 

MOV

AL,[SI+BX]

; выбрать ASCII-символ

 

 

77

AND

AX,000FH

; очистить зону тройки

MUL

MULT10

; умножить на фактор 10

ADD

BINVAL_w,AX

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

MOV

AX,MULT10

; вычислить следующий

MUL

CX

; фактор умножения

MOV

MULT10,AX

 

DEC

BX

; последний. ASCII-символ?

JNZ

B20

; нет – продолжить

ret

ASC2BIN_WORD ENDP

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

ASC2BIN_dword proc ;процедура перевода из ASCII в bin для двойного слова mov mult10,1

mov binval_d,0 xor ax,ax xor dx,dx mov cx,10

lea si,namefld_d-1 mov bl,faktlen_d mov bh,0

abd20:

mov al,[si+bx] and ax,000fh mul mult10

add word ptr binval_d,ax adc word ptr binval_d+2,dx mov ax,mult10

mul cx

mov mult10,ax dec bx

jnz abd20 ret

ASC2BIN_dword endp

;*************************************************************************** ;перевод из ASCII в bin числа b1

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

ENTB1 PROC

 

B1B:

 

;

вывод сообщения 'b1= '

mov ah,09

 

lea dx,soob2

 

int 21h

 

;

ввод с клавиатуры b1

mov ah,0Ah

 

lea dx,NAMEPAR_b

 

int 21h

 

 

78

CALL STROKA

 

call ASC2BIN_BYTE

;перевод из ASCII в bin

xor ax,ax

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

mov al,byte ptr binval_b

 

mov b1,al

 

mov al,b1

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

cmp al,127

 

ja B1M

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

jmp B1E

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

B1M:

 

mov ah,09

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

lea dx,STRERR1

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

int 21h

 

jmp B1B

; переход на QQ1

B1E:

 

RET ENTB1 ENDP

;*************************************************************************** ; перевод из ASCII в bin числа b2 ;***************************************************************************

ENTB2 PROC

 

B2B:

 

 

mov ah,09

; вывод сообщения 'b2= '

 

lea dx,soob3

 

;

int 21h

ввод с клавиатуры b2

mov ah,0Ah

 

 

 

lea dx,NAMEPAR_b

 

 

int 21h

 

;

mov mult10,1

 

 

CALL STROKA

 

call ASC2BIN_BYTE

;перевод из ASCII в bin

xor ax,ax

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

mov al,byte ptr binval_b

 

mov b2,al

 

mov al,b2

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

 

cmp al,127

 

 

ja B2M

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

jmp B2E

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

B2M:

 

 

mov ah,09

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

 

lea dx,STRERR1

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

 

int 21h

 

 

jmp B2B

; переход на o1o

 

 

79

B2E:

RET ENTB2 ENDP

;*************************************************************************** ; перевод из ASCII в bin числа b3 ;***************************************************************************

ENTB3 PROC B3B:

mov ah,09 ; вывод сообщения 'b3= ' lea dx,soob4

int 21h

;

ввод с клавиатуры b3

mov ah,0Ah

lea dx,NAMEPAR_b int 21h

CALL STROKA

;mov mult10,1

;перевод из ASCII в bin call ASC2BIN_BYTE

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

xor ax,ax

mov al,byte ptr binval_b mov b3,al

mov al,b3

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

cmp al,127

 

ja B3M

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

jmp B3E

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

B3M:

 

mov ah,09

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

lea dx,STRERR1

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

int 21h

 

jmp B3B

; переход на o2o

B3E:

 

RET ENTB3 ENDP

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

;перевод из ASCII в bin числа b13 ;***************************************************************************

ENTB13 PROC B13B:

;вывод сообщения 'b13= '

 

mov ah,09

 

lea dx,soob13

 

int 21h

;

ввод с клавиатуры b13

 

mov ah,0Ah

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]