Алгоритм программы
Сначала пользователь попадает в тестовый режим, где расшифрованы главные кнопки. Далее он нажимает Enter, чтобы начать работу. Попадает в графический режим. Для работы с мышью используется прерывание 33h, где в ax записывается условие вызова, в bx – состояние кнопок, cx – координата курсора x, dx – координата курсора y. В окне уже отрисовались 5 блоков. Появился курсор мыши. Чтобы начать вводить числа, пользователь должен направить курсор мыши на первый блок и нажать на него – появится сообщение «Input the first number». Пользователь вводит число, курсор мыши в этот момент скрыт. Как только число введено, следует нажать на Enter. Курсор мыши появляется, можно выбирать блоки дальше. С блоками операции и второго числа поступаем аналогично. Когда все числа введены, операция задана, нужно нажать на блок «=». В последний блок будет выведен ответ.
Esc – выход из программы, видеорежим изменяется на текстовый, далее используется функция возврат в операционную систему 4C00h.
Текст программы
data_seg segment
x dw ? ;координаты мышки
y dw ?
a dw ? ;первое число
op dw ? ;операция
b dw ? ;второе число
sum dw ? ;сумма
razn dw ? ;разность
pr dw ? ;произведение
del dw ? ;деление
ost dw ? ;остаток
x_n dw ? ;вспомогательные координаты для рисования
y_n dw ?
x_n1 dw ?
y_n1 dw ?
color db ? ;цвет рамки блока
color_f db ? ;цвет фона
stroka db " Enter - start, Esc - exit $"
stroka1 db " Input the first number $"
stroka2 db " Input the second number $"
stroka_op db " Input the operation $"
stroka3 db " $"
blok db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
ravno db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,3,3,3,8,8
db 8,8,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,3,3,3,8,8
db 8,8,3,3,3,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
db 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
data_seg ends
stack_seg segment para stack 'stack'
dw 100 dup (?)
stack_seg ends
cod_seg segment
ASSUME cs:cod_seg, ds:data_seg, ss:stack_seg
start:
mov ax,data_seg
mov ds,ax
mov ah,09h
lea dx,stroka
int 21h
mov ah,01h
int 21h
cmp al,0dh
je @@2
cmp al,1bh
je @@1
@@1: call exit
@@2: call work
mov ah,08h
int 21h
color_fon proc ;отрисовка фона
push cx
push dx
mov ah,0bh
mov bh,00
mov bl,color_f
int 10h
pop dx
pop cx
ret
color_fon endp
draw1 proc ;рисуем первый блок
push cx
push dx
lea si,blok
mov cx,0 ;откуда рисовать
mov dx,0
mov x_n1,cx
mov y_n1,dx
mov x_n,cx
mov y_n,dx
mov cx,24h ;строки
d@@1: push cx
mov cx,2Dh ;столбцы
push cx
mov dx,y_n
inc dx
mov y_n,dx
mov cx,x_n1
mov x_n,cx
pop cx
d@@2: push cx
mov cx,x_n
mov dx,y_n
mov ah,0ch
mov bh,00
mov al,[si]
cmp al,03
je d@@3
add al,color
jmp d@@4
d@@3: mov al,color_f
d@@4: int 10h
inc si
inc cx
mov x_n,cx
pop cx
loop d@@2
pop cx
loop d@@1
pop dx
pop cx
ret
draw1 endp
draw_op proc
push cx
push dx
lea si,blok
mov cx,37h ;откуда рисовать
mov dx,0
mov x_n1,cx
mov y_n1,dx
mov x_n,cx
mov y_n,dx
mov cx,24h ;строки
d@@5: push cx
mov cx,2dh ;столбцы
push cx
mov dx,y_n
inc dx
mov y_n,dx
mov cx,x_n1
mov x_n,cx
pop cx
d@@6: push cx
mov cx,x_n
mov dx,y_n
mov ah,0ch
mov bh,00
mov al,[si]
cmp al,03
je d@@7
add al,color
jmp d@@8
d@@7: mov al,color_f
d@@8: int 10h
inc si
inc cx
mov x_n,cx
pop cx
loop d@@6
pop cx
loop d@@5
pop dx
pop cx
ret
draw_op endp
draw2 proc
push cx
push dx
lea si,blok
mov cx,6eh ;откуда рисовать
mov dx,0
mov x_n1,cx
mov y_n1,dx
mov x_n,cx
mov y_n,dx
mov cx,24h ;строки
d@@9: push cx
mov cx,2dh ;столбцы
push cx
mov dx,y_n
inc dx
mov y_n,dx
mov cx,x_n1
mov x_n,cx
pop cx
d@@10: push cx
mov cx,x_n
mov dx,y_n
mov ah,0ch
mov bh,00
mov al,[si]
cmp al,03
je d@@11
add al,color
jmp d@@12
d@@11: mov al,color_f
d@@12: int 10h
inc si
inc cx
mov x_n,cx
pop cx
loop d@@10
pop cx
loop d@@9
pop dx
pop cx
ret
draw2 endp
draw_ravno proc
push cx
push dx
lea si,ravno
mov cx,0a5h ;откуда рисовать
mov dx,0
mov x_n1,cx
mov y_n1,dx
mov x_n,cx
mov y_n,dx
mov cx,24h ;строки
d@@13: push cx
mov cx,28h ;столбцы
push cx
mov dx,y_n
inc dx
mov y_n,dx
mov cx,x_n1
mov x_n,cx
pop cx
d@@14: push cx
mov cx,x_n
mov dx,y_n
mov ah,0ch
mov bh,00
mov al,[si]
cmp al,03
je d@@15
add al,color
jmp d@@16
d@@15: mov al,color_f
d@@16: int 10h
inc si
inc cx
mov x_n,cx
pop cx
loop d@@14
pop cx
loop d@@13
pop dx
pop cx
ret
draw_ravno endp
draw_rez proc
push cx
push dx
lea si,blok
mov cx,0dch ;откуда рисовать
mov dx,0
mov x_n1,cx
mov y_n1,dx
mov x_n,cx
mov y_n,dx
mov cx,24h ;строки
d@@17: push cx
mov cx,2dh ;столбцы
push cx
mov dx,y_n
inc dx
mov y_n,dx
mov cx,x_n1
mov x_n,cx
pop cx
d@@18: push cx
mov cx,x_n
mov dx,y_n
mov ah,0ch
mov bh,00
mov al,[si]
cmp al,03
je d@@19
add al,color
jmp d@@20
d@@19: mov al,color_f
d@@20: int 10h
inc si
inc cx
mov x_n,cx
pop cx
loop d@@18
pop cx
loop d@@17
pop dx
pop cx
ret
draw_rez endp
mouse_visible proc ;функция, которая показывает курсор мышки в указанных координатах
mov ax,00h
int 33h
mov ax,01h
mov cx,100
mov dx,100
int 33h
ret
mouse_visible endp
coord proc
xor bx,bx
mov ax,03h ;считываем состояние мышки, координаты
int 33h
cmp dx,24h
jb @1
jmp @0
@1: cmp cx,2dh
jb @w1; если это первый блок, то выполняем ввод числа в первый блок
cmp cx,37h
ja @2
@2: cmp cx,64h
jb @w2; если это второй блок, то выполняем ввод операции
cmp cx,6eh
ja @3
@3: cmp cx,9bh
jb @w3; если это третий блок, то выполняем ввод второго числа
cmp cx,0a5h
ja @4
@4: cmp cx,0d2h
jb @w4; если это четвертый блок, то выполняем операции
@w1: call curs ;выполняется работа для первого блока – ввод первого числа
mov ah,09h
lea dx,stroka1
int 21h
mov ax,02h
int 33h
mov ah,02h
mov bh,00
mov dh,01
mov dl,01
int 10h
call input ;считываем число и заносим его в ах
mov a, ax
mov ax,01h
int 33h
jmp @0
@w2: call curs ;выполняется работа для второго блока – вводим операцию
mov ah,09h
lea dx,stroka_op
int 21h
mov ax,02h
int 33h
mov ah,02h
mov bh,00
mov dh,01
mov dl,09
int 10h
call input_op ;считываем и заносим в переменную ор соответствующее число
mov ax,01h
int 33h
jmp @0
@w3: call curs ;выполняется ввод второго числа
mov ah,09h
lea dx,stroka2
int 21h
mov ax,02h
int 33h
mov ah,02h
mov bh,00
mov dh,01
mov dl,015
int 10h
call input ;считываем и заносим число в ах
mov b,ax
mov ax,01h
int 33h
jmp @0
@w4: mov cx,op ; проверяем какая операция была введена
call curs
mov ah,09h
lea dx,stroka3
int 21h
cmp cx,1 ; 1 - сумма
je @@op1
cmp cx,2 ; 2 - разность
je @@op2
cmp cx,3 ; 3 - произведение
je @@op3
cmp cx,4 ; 4 - деление
je @@op4
@@op1: mov sum,0 ; считаем сумму
mov ax,a
add sum,ax
mov ax,b
add sum,ax
mov ah,02h
mov bh,00
mov dh,01
mov dl,030
int 10h
mov dx,sum
call write_10
jmp @0
@@op2: mov razn,0 ;считаем разность
mov ax,a
add razn,ax
mov ax,b
sub razn,ax
mov ah,02h
mov bh,00
mov dh,01
mov dl,030
int 10h
mov dx,razn
call write_10
jmp @0
@@op3: mov ax,a ; считаем произведение
mov bx,b
mul bx
mov pr, ax
mov pr+2, dx
mov ah,02h
mov bh,00
mov dh,01
mov dl,030
int 10h
mov dx, pr
call write_10
jmp @0
@@op4: mov ax,a ; считаем деление
xor dx,dx
div b
mov ost, dx
mov del, ax
mov ah,02h
mov bh,00
mov dh,01
mov dl,030
int 10h
mov dx, del
call write_10
mov ah,02h
;вывод символа на экран
mov dl, '.'
int 21h
mov ax, ost ; вычисляем остаток
mov cx, 10
xor dx,dx
mul cx
xor dx,dx
div b
mov ost, dx
mov dx, ax
call write_10
jmp @0
@0: ret
coord endp
work proc
mov ah,00 ; установка графического режима
mov al,12h
int 10h
mov color,04 ; задаем цвета
mov color_f,00
call color_fon ; рисуем все объекты
call draw1
call draw_op
call draw2
call draw_ravno
call draw_rez
call mouse_visible ; показываем курсор мышки
@@@1: mov ah,06h ; функция для консольного ввода
mov dl,0ffh
int 21h
cmp al,1bh ;если нажата Esc – выход
je @@@2
mov ax,03h
int 33h
cmp bx,00000001b ; если нажата левая клавиша мышки, то выполняется функция coord
jne @@@1
call coord
jmp @@@1
@@@2: call exit
@@@3: ret
work endp
input proc
push cx
push dx
push bx
push si
; в BX - число, CX - цифры.
xor bx, bx
xor cx, cx
xor si,si
; Введём первый символ.
@ii0:
mov ah, 08h ;ввод без отображения на экран
int 21h
@ii1:
cmp si, 3 ;если введено три числа, то конец ввода
je @ii3
cmp al, 0dh
je @ii3
cmp al, '0'
jb @ii0
cmp al, '9'
ja @ii0
;да это символ из ['0'..'9']
mov ah,02h ;вывод символа на экран
mov dl, al
int 21h
inc si
; Переводим символ в число.
sub al, '0'
; В AL цифра, которую нужно приписать справа к уже имеющемуся в BX числу
; Поместим цифру из AL в CX. Именно для этого он обнулялся.
mov cl, al
; Умножим текущий результат на 10.
shl bx, 1 ; BX = 2 * bx
mov ax, bx ; AX = 2 * bx
shl ax, 2 ; AX = 8 * bx
add bx, ax ; BX = 10 * bx
add bx, cx ; BX = 10 * bx + al
; И так, пока вводят цифры.
jmp @ii0
; Когда введено три цифры
; запишем результат в AX
@ii3: mov ax, bx
pop si
pop bx
pop dx
pop cx
ret
input endp
input_op proc
mov ah,01h
int 21h
cmp al,2ah ;если *
je @op1
cmp al,2bh ; если +
je @op2
cmp al,2dh ;если -
je @op3
cmp al,2fh ;если /
je @op4
jmp @op
@op1: mov op,3
jmp @op
@op2: mov op,1
jmp @op
@op3: mov op,2
jmp @op
@op4: mov op,4
jmp @op
@op: ret
input_op endp
curs proc ;функция для позиционирования курсора в месте вывода подсказок
mov ah,02h
mov bh,00
mov dh,03
mov dl,00
int 10h
ret
curs endp
curs_r proc ; функция позиционирования в месте вывода ответа
mov ah,02h
mov bh,00
mov dh,05
mov dl,00
ret
curs_r endp
write_10 proc ; вывод в 10-тичной форме
push ax
push cx
push dx
push si
mov ax,dx
mov si,10
mov cx,0
non_zero:
mov dx,0
div si
push dx
inc cx
cmp ax,0
jne non_zero
metka1:
pop dx
call wr_cifra
loop metka1
pop si
pop dx
pop cx
pop ax
ret
write_10 endp
wr_cifra proc
add dl,30h
mov ah,2
int 21h
ret
wr_cifra endp
exit proc ; выход из программы
mov ah,00
mov al,03h
int 10h
mov ax,4c00h
int 21h
ret
exit endp
cod_seg ends
end start