Задание такое (делается в emu8086): Пользователь вводит координаты левого верхнего (x1, y1) и правого нижнего (x2, y2) углов прямоугольника. Программа должна нарисовать прямоугольник на экране и вывести его периметр (P) и площадь (S).
Примечание: Для ввода/вывода использовать прерывания (INT). Не использовать никакие команды "emu, macro" и т.п.
Вот код:
Код: Выделить всё
include 'emu8086.inc'
org 100h
jmp kod
dannie:
dlina dw 0
sirina dw 0
xkord dw 0
ykord dw 0
plosiad dw 0
perimetr dw 0
msg1 db 'Vvedite x koordinatu centra priamougolnika:', '$'
msg2 db 'Vvedite y koordinatu centra priamougolnika:', '$'
msg3 db 'Vvedite sirinu priamougolnika:', '$'
msg4 db 'Vvedite dlinu priamougolnika:', '$'
msg5 db 'Plosiad Vasego priamougolnika ravna: ', '$'
msg6 db 'Dlina Vashego priamougolnika ravna: ', '$'
msg7 db 'Certim? (Nazmite liubuiu klavishu)', '$'
p1 dw 0 ;x konec verhnei linii
p2 dw 0 ;y konec levoi linii
p3 dw 0 ;x konec niznei linii
p4 dw 0 ;y konec pravoi linii
kod:
;--vivodim znacenia
mov dx, offset msg1
mov ah, 9
int 21h
call scan_num
mov xkord, cx
call CLEAR_SCREEN
mov dx, offset msg2
mov ah, 9
int 21h
call scan_num
mov ykord, cx
call CLEAR_SCREEN
mov dx, offset msg3
mov ah, 9
int 21h
call scan_num
mov sirina, cx
call CLEAR_SCREEN
mov dx, offset msg4
mov ah, 9
int 21h
call scan_num
mov dlina, cx
;--
;--scitaem plosiad i perimetr
mov al, b.[dlina]
mov bl, b.[sirina]
mul bl
mov plosiad, ax
mov bx, 0
add bx, sirina
add bx, sirina
add bx, dlina
add bx, dlina
mov perimetr, bx
call CLEAR_SCREEN
mov dx, offset msg5
mov ah, 9
int 21h
mov dx, offset msg6
mov ah, 9
int 21h
mov dx, offset msg7
mov ah, 9
int 21h
mov ah, 0
int 16h
;--nahodim verhniy praviy ugol priamogugolnika
mov ax, xkord
mov bl, 2
div bl
mov b.[xkord], al
mov ax, ykord
mov bl, 2
div bl
mov b.[ykord], al
;--
;--vistavliaem video rezim 320x200, 256 cvetov
mov al, 13h
mov ah, 0
int 10h
;--
mov cx, xkord
mov dx, ykord
mov bx,dlina
add bx,xkord
mov p1, bx
;--certim verhniuiu liniu
mov al, 50
verhniaiaLinia:
mov ah, 0ch
int 10h
inc cx
cmp cx,p1
JNAE verhniaiaLinia
;--
mov cx, xkord
mov dx, ykord
mov bx, ykord
add bx, sirina
mov p2, bx
;--certim levuiu liniu
levaiaLinia:
mov ah,0ch
int 10h
inc dx
cmp dx,p2
JNAE levaiaLinia
;--
mov bx, cx
add bx, dlina
mov p3, bx
;--certim nizniuiu liniu
nizniaiaLinia :
mov ah,0ch
int 10h
inc cx
cmp cx,p3
JNAE nizniaiaLinia
;--
mov bx,ykord
mov p4, bx
;--certim pravuiu liniu
pravaiaLinia:
mov ah,0ch
int 10h
dec dx
cmp dx,p4
JNB pravaiaLinia
ret
DEFINE_SCAN_NUM
DEFINE_CLEAR_SCREEN
end
2. Можно ли сократить код? Ибо преподу может не понравится такой длинный код.
Заранее благодарю за оказанную помощь.