Загрузка данных
; Lab 7, task 1.8 (Figure 3a) - point in square [-10..10] x [-10..10]
; Point (x, y) entered from console
; Subprogram returns 1 if inside/on border, else 0 (in AX)
dosseg
.model small
.stack 200h
.data
msgX db 'Enter X: $'
msgY db 'Enter Y: $'
msgRes1 db 0ah, 'Point 1: $'
msgRes2 db 0ah, 'Point 2: $'
msgInside db 'inside the shaded square$'
msgOutside db 'outside the shaded square$'
cr equ 0dh
lf equ 0ah
string db 255, 0, 255 dup(?)
errmsg db 'Invalid char, digits only', cr, lf, '$'
negflag dw ?
.code
; ----------------------------------------------
; IntegerIn - reads signed integer from console
; Returns: AX = integer value
; ----------------------------------------------
IntegerIn proc
start:
mov ah, 0ah
lea dx, string
int 21h
xor ax, ax
lea si, string+2
mov negflag, ax
cmp byte ptr [si], '-'
jne m2
not negflag
inc si
jmp m3
m2:
cmp byte ptr [si], '+'
jne m3
inc si
m3:
cmp byte ptr [si], cr
je ex1
cmp byte ptr [si], '0'
jb err1
cmp byte ptr [si], '9'
ja err1
mov bx, 10
mul bx
sub byte ptr [si], '0'
add al, [si]
adc ah, 0
inc si
jmp m3
err1:
lea dx, errmsg
mov ah, 9
int 21h
jmp start
ex1:
cmp negflag, 0
je ex
neg ax
ex:
ret
IntegerIn endp
; ----------------------------------------------
; IntegerOut - prints signed integer in AX
; ----------------------------------------------
IntegerOut proc
xor cx, cx
mov bx, 10
cmp ax, 0
jge m
neg ax
push ax
mov ah, 2
mov dl, '-'
int 21h
pop ax
m:
inc cx
xor dx, dx
div bx
push dx
or ax, ax
jnz m
m1:
pop dx
add dl, '0'
mov ah, 2
int 21h
loop m1
ret
IntegerOut endp
; ----------------------------------------------
; IsPointInSquare
; Input via stack:
; [bp+6] = Y
; [bp+4] = X
; Returns AX = 1 (inside) or 0 (outside)
; Square: |X| <= 10 and |Y| <= 10
; ----------------------------------------------
IsPointInSquare proc near
push bp
mov bp, sp
mov ax, [bp+4] ; X
cmp ax, -10
jl outside
cmp ax, 10
jg outside
mov ax, [bp+6] ; Y
cmp ax, -10
jl outside
cmp ax, 10
jg outside
mov ax, 1
jmp finish
outside:
xor ax, ax
finish:
pop bp
ret 4 ; remove 2 parameters (X, Y)
IsPointInSquare endp
; ----------------------------------------------
; Main program
; ----------------------------------------------
Begin:
mov ax, @data
mov ds, ax
; --- Point 1 ---
mov ah, 9
lea dx, msgX
int 21h
call IntegerIn
push ax ; X1
mov ah, 9
lea dx, msgY
int 21h
call IntegerIn
push ax ; Y1
call IsPointInSquare
push ax ; save result 1
; --- Point 2 ---
mov ah, 9
lea dx, msgX
int 21h
call IntegerIn
push ax ; X2
mov ah, 9
lea dx, msgY
int 21h
call IntegerIn
push ax ; Y2
call IsPointInSquare
; stack now: result1, result2
; Output results
mov ah, 9
lea dx, msgRes1
int 21h
pop ax
call print_result
mov ah, 9
lea dx, msgRes2
int 21h
pop ax
call print_result
mov ax, 4C00h
int 21h
; ----------------------------------------------
print_result proc
cmp ax, 1
jne out_msg
lea dx, msgInside
jmp print
out_msg:
lea dx, msgOutside
print:
mov ah, 9
int 21h
ret
print_result endp
end Begin