mov word ptr rez4,ax
;b1 and b2 xor (w1 xor b3) or (d1 or d2) xor ax,ax
mov ax,word ptr rez4 or ax,word ptr rez3 mov word ptr rezult,ax ret
formula2 endp
csg_mod ends
end formula2
==================================================================
; l_2_1kln.asm КАЛИНИН МИХАИЛ, СибАДИ, гр. БИ11, октябрь 2004г.
STACKSG SEGMENT PARA STACK 'STACK' ;\
db 1024 dup(?) |
; сегмент стека |
STACKSG ENDS |
;/ |
public soobe_1,soobe_2,soob0_err,soob_b1,soob_b2,soob_d1,soob_d2,b1,b2,d1,d2,num_ln,mult 10,rezult,ten,ascval,binval_d,binval_w,binval_b,binval
public cursor,ascii_binw,ascii_bind,ascii_binb,clrascval public
soob0_3,soobl_err,soobl,soobl_1,soobl_2,soobl_3,soobl_4,soobl_5,soobl_n1,soobl_n2,soo bl_n3,soobl_n4,soobl_n5
public namepar_b,maxlen_b,faktlen_b,namefld_b,namepar_w,maxlen_w,faktlen_w,namefld_w ,namepar_d,maxlen_d,faktlen_d,namefld_d,namepar,maxlen,faktlen,namefld
public clrscr,bin_bin extrn main:proc
DATASG SEGMENT PARA 'DATA' ;начало сегмента данных
SOOB1 db 'Здравствуйте, уважаемый пользователь!','$' SOOB0 db 'w1*w2+d1/b1-(w3+b2+b3)','$'
soob0_1 db 'Выберите номер действия:','$'
soob0_2 db '[1] вычисления по формуле w1*w2+d1/b1-(w3+b2+b3)','$' soob0_3 db '[2] логические операции','$'
soob0_4 db '[3] покинуть программу','$' soobe_1 db '[1] главное меню','$' soobe_2 db '[2] покинуть программу','$'
soob0_err db 'Ошибка выбора номера операции, выберите снова','$' soobl_err db 'Ошибка выбора номера формулы, выберите снова','$' soobl db 'Выберите номер формулы:','$'
soobl_1 db 'b1 or b2','$'
101
soobl_2 db 'b1 xor b2','$' soobl_3 db 'b1 and b2','$' soobl_4 db 'b1 and not(b2)','$' soobl_5 db 'd1 and neg(d2)','$' soobl_n1 db '[1] b1 or b2','$' soobl_n2 db '[2] b1 xor b2','$' soobl_n3 db '[3] b1 and b2','$'
soobl_n4 db '[4] b1 and not(b2)','$' soobl_n5 db '[5] d1 and neg(d2)','$'
soob_w1 db 'w1=','$' soob_w2 db 'w2=','$' soob_d1 db 'd1=','$' soob_b1 db 'b1=','$' soob_w3 db 'w3=','$' soob_b2 db 'b2=','$' soob_b3 db 'b3=','$' soob_d2 db 'd2=','$'
soob_error db 'Ошибка ввода, введите заново','$'
soob_error_b db 'Введено число больше 127, повторите ввод','$' soob_error_w db 'Введено число больше 32767, повторите ввод','$' soob_error_d db 'Введено число больше 2147483648, повторите ввод','$'
soob_error_b1 db 'В данной формуле b1 не может быть равно нулю, повторите ввод','$'
NAMEPAR_b LABEL BYTE
MAXLEN_b db 4
FAKTLEN_b db ?
NAMEFLD_b db "0000"
NAMEPAR_w LABEL BYTE
MAXLEN_w db 6
FAKTLEN_w db ?
NAMEFLD_w db "000000"
NAMEPAR_d LABEL BYTE
MAXLEN_d db 12
FAKTLEN_d db ?
NAMEFLD_d db "000000000000"
NAMEPAR LABEL BYTE
MAXLEN db 2
FAKTLEN db ?
NAMEFLD db "00"
binval_b dw 0 binval_w dw 0 binval_d dd 0
102
binval dw 0
b1 db 0
b2 db 0
b3 db 0
w1 dw 0
w2 dw 0
w3 dw 0
d1 dd 0
d2 dd 0
rez_1 dd 0 rez_2 dw 0 rez_3 dw 0
num_ln db 00 mult10 dw 1 err db 1 rezult dd 0 ten db 0
ascval db "00000000000000000000000000000000","$"
DATASG ENDS |
|
;конец сегмента данных |
CODESG SEGMENT PARA 'CODE' |
;начало сегмента кода |
|
BEGIN PROC FAR |
|
;начало основной процедуры |
assume cs:codesg,ds:datasg,ss:stacksg |
;связь сегментов с сегментными регистрами |
|
push ds |
|
|
xor ax,ax |
|
|
push ax |
|
|
mov ax,datasg |
|
|
mov ds,ax |
|
|
beg: call clrscr |
|
|
call cursor |
;вызов процедуры перевода курсора |
|
mov ah,09h |
;функция вывода на экран |
|
lea dx,soob1 |
;загрузить адрес начала сообщения в dx |
|
int 21h |
;передача управления в DOS |
|
call cursor |
;вызов процедуры перевода курсора |
|
mov ah,09h |
;функция вывода на экран |
|
lea dx,soob0_1 |
;загрузить адрес начала сообщения в dx |
|
int 21h |
;передача управления в DOS |
|
|
|
103 |
|
call cursor |
|
;вызов процедуры перевода курсора |
|
mov ah,09h |
|
;функция вывода на экран |
|
lea dx,soob0_2 |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
|
;передача управления в DOS |
|
call cursor |
|
;вызов процедуры перевода курсора |
|
mov ah,09h |
|
;функция вывода на экран |
|
lea dx,soob0_3 |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
|
;передача управления в DOS |
|
call cursor |
|
;вызов процедуры перевода курсора |
|
mov ah,09h |
|
;функция вывода на экран |
|
lea dx,soob0_4 |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
|
;передача управления в DOS |
|
call cursor |
|
;вызов процедуры перевода курсора |
vvod: |
mov ah,0ah |
|
|
|
lea dx,namepar |
|
|
|
int 21h |
|
|
|
xor ax,ax |
|
|
|
lea si,namefld |
|
|
|
mov al,[si] |
|
|
|
and al,00fh |
|
|
|
mov binval,ax |
|
|
|
call cursor |
|
|
|
cmp binval,1 |
|
|
|
je arifm |
|
|
|
cmp binval,2 |
|
|
|
je log |
|
|
|
cmp binval,3 |
|
|
|
je jmp_rt |
|
|
|
mov ah,09h |
|
|
|
lea dx,soob0_err |
|
|
|
int 21h |
|
|
|
call cursor |
|
|
|
jmp vvod |
|
|
jmp_rt:jmp dos |
|
|
|
log: |
call main |
|
|
|
jmp beg |
|
|
arifm: mov ax,0600h ;\ |
|al=00 (весь экран), ah=06 (прокрутка) |
||
|
mov bh,07 |
; \ |
|чёрно-белый |
|
|
|
104 |
mov cx,0000 |
; очистка экрана |
|левая верхняя позиция |
|
mov dx,314fh ; / |
|
|правая нижняя позиция |
|
int 10h |
;/ |
|
|передача управления в BIOS |
mov num_ln,0 |
|
|
|
call cursor |
|
;вызов процедуры перевода курсора |
|
mov ah,09h |
|
;функция вывода на экран |
|
lea dx,soob0 |
|
|
|
int 21h |
|
|
|
call cursor |
|
;вызов процедуры перевода курсора |
|
;======================= перевод из ASCII в bin числа w1 =================
lw1: |
mov ah,09h |
;вывод на экран сообщения 'w1=' |
|
lea dx,soob_w1 |
|
|
int 21h |
|
|
mov ah,0ah |
;ввод с клавиатуры w1 |
|
lea dx,namepar_w |
|
|
int 21h |
|
|
call symbol_w |
|
|
mov al,err |
|
|
cbw |
|
|
jns lw1 |
|
|
call ASCII_binw |
;вызов процедуры перевода из ASCII в bin числа w1 |
|
xor ax,ax |
;ax=0 |
|
mov ax,binval_w |
;поместить в ax число w1 |
|
mov w1,ax |
;поместить в переменную w1 число w1 |
|
call cursor |
|
|
xor ax,ax |
|
|
mov ax,w1 |
;поместить в ax число w1 |
|
cmp ax,32767 |
;сравнение числа w1 с 32767 |
|
ja ew1 |
;если w1>32767, то на метку ew1 |
|
xor ax,ax |
|
|
jmp lw2 |
;если w1<=32767, то на метку lw2 |
ew1: |
mov ah,09h |
;сообщение об ошибке |
|
lea dx,soob_error_w |
|
|
int 21h |
|
|
call cursor |
;вызов процедуры перевода курсора |
|
jmp lw1 |
;переход на метку lw1 |
|
|
105 |