Код: Выделить всё
org 100h
; приветствие
mov dx, offset msg1
mov ah, 9
int 21h
call MY_SCAN_NUM
; очистка экрана
call CLEAR_SCREEN
; вывод значений
mov dx, offset msg2
mov ah, 9
int 21h
call MY_SCAN_NUM
mov xkord, cx
call CLEAR_SCREEN
mov dx, offset msg3
mov ah, 9
int 21h
call MY_SCAN_NUM
mov ykord, cx
call CLEAR_SCREEN
mov dx, offset msg4
mov ah, 9
int 21h
call MY_SCAN_NUM
mov shirina, cx
call CLEAR_SCREEN
mov dx, offset msg5
mov ah, 9
int 21h
call MY_SCAN_NUM
mov dlina, cx
; вычисляем площадь и периметр прямоугольника
; площадь прямоугольника
mov ax, dlina
mul shirina
mov plosiad, ax
; периметр прямоугольника
mov bx, shirina
add bx, dlina
add bx, bx
mov perimetr, bx
call CLEAR_SCREEN
mov dx, offset msg6
mov ah, 9
int 21h
mov AX, plosiad
call vivod_cisla
mov dx, offset msg7
mov ah, 9
int 21h
mov AX, perimetr
call vivod_cisla
mov dx, offset msg8
mov ah, 9
int 21h
mov ah, 0
int 16h
; находим правый верхний угол прямоугольника
mov ax, xkord
mov bl, 2
div bl
mov b.[xkord], al
mov ax, ykord
mov bl, 2
div bl
mov b.[ykord], al
; выставляем видео режим 640x480, 16 цветов
mov al, 12h
mov ah, 0
int 10h
mov cx, xkord
mov dx, ykord
mov bx,dlina
add bx,xkord
mov p1, bx
; чертим верхнюю линию
mov al, 50
VerhLinia:
mov ah, 0ch
int 10h
inc cx
cmp cx,p1
JNAE VerhLinia
mov cx, xkord
mov dx, ykord
mov bx, ykord
add bx, shirina
mov p2, bx
; чертим левую линию
LevLinia:
mov ah,0ch
; левая линия фиолетового цвета
mov al, 5
int 10h
inc dx
cmp dx,p2
JNAE LevLinia
mov bx, cx
add bx, dlina
mov p3, bx
; чертим нижнюю линию
NiznLinia:
mov ah,0ch
; нижняя линия красного цвета
mov al, 4
int 10h
inc cx
cmp cx,p3
JNAE NiznLinia
mov bx,ykord
mov p4, bx
; чертим правую линию
PravLinia:
mov ah,0ch
; правая линия голубого цвета
mov al, 3
int 10h
dec dx
cmp dx,p4
JNB PravLinia
ret
MY_SCAN_NUM PROC NEAR
mov AH, 2
mov DL, '>' ; приглашение
int 21h ; выводим приглашение
xor DI, DI ; итоговое число, - пока ноль
my_input:
mov AH, 8 ; ввод символа без показа
int 21h
cmp AL, 13 ; Enter нажали ?
je Oxid_vihod ; да - уходим
cmp AL, '9'
ja my_input ; какую-то бОльшую букву ввели - игнорируем
cmp AL, '0'
jb my_input ; какую-то меньшую букву ввели - игнорируем
mov AH, 2
mov DL, AL ; цифра
int 21h ; выводим цифру
sub AL, '0' ; преобразуем символ в число 0..9
xor AH, AH ; AH = 0
mov CX, AX ; цифра теперь в CX
mov AX, DI ; в AX наш итог
mov BX, 10 ; десятичная у нас система ввода
mul BX ; AX = AX*10
add AX, CX ; добавим нашу цифру
mov DI, AX ; результат в DI
jmp my_input ; на следующую цифру
Oxid_vihod:
mov CX, DI ; запишем результат
RET ; валим
MY_SCAN_NUM ENDP
;------------
; процедура CLEAR_SCREEN
CLEAR_SCREEN PROC NEAR
PUSH AX ; store registers...
PUSH DS ;
PUSH BX ;
PUSH CX ;
PUSH DI ;
MOV AX, 40h
MOV DS, AX ; for getting screen parameters.
MOV AH, 06h ; scroll up function id.
MOV AL, 0 ; scroll all lines!
MOV BH, 07 ; attribute for new lines.
MOV CH, 0 ; upper row.
MOV CL, 0 ; upper col.
MOV DI, 84h ; rows on screen -1,
MOV DH, [DI] ; lower row (byte).
MOV DI, 4Ah ; columns on screen,
MOV DL, [DI]
DEC DL ; lower col.
INT 10h
; set cursor position to top
; of the screen:
MOV BH, 0 ; current page.
MOV DL, 0 ; col.
MOV DH, 0 ; row.
MOV AH, 02
INT 10h
POP DI ; re-store registers...
POP CX ;
POP BX ;
POP DS ;
POP AX ;
RET
CLEAR_SCREEN ENDP