2591
.pdfFAKTLEN_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