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