Сначала давайте будем точными
То, что вы назвали ДЛИНА на самом деле ШИРИНА , поскольку оно относится к горизонтальному направлению.
То, что вы назвали WIDTH , на самом деле HEIGHT , потому что оно относится к вертикальному направлению.
Это остается верным, даже если ширина намного больше, чем высота, и когда становится заманчивым говорить о длине и ширине.
Также обратите внимание, что эта же путаница привела к числовой ошибке в вашем коде ([bp+6]
против [bp+8]
).
Тогда решите проблему
Как сделать местоположение типа числа в x, y типе местоположения
В настоящее время ваша программа использует (смещение) адрес для ссылки на пиксель. Этот адрес легко преобразовать в координаты (x, y). Все, что требуется, это деление на длину строки сканирования экрана. Частное (AX
) дает вам координату y, а остаток (DX
) дает вам координату x.
mov ax, [bp+10] ; LOCATION
xor dx, dx
mov cx, 320
div cx ; -> DX = X, AX = Y
mov si, dx ; X
mov di, ax ; Y
mov ax, [bp+4] ; TOP LEFT LOCATION OF BORDER
xor dx, dx
div cx ; -> DX = TopLeftX, AX = TopLeftY
Координаты нижнего правого угла прямоугольника:
(BottomRightX, BottomRightY) = (TopLeftX + Ширина - 1, TopLeftY + Высота - 1)
mov bx, dx ; TopLeftX
add bx, [bp+6] ; + WIDTH
dec bx ; - 1
mov cx, ax ; TopLeftY
add cx, [bp+8] ; + HEIGHT
dec cx ; - 1
Это то, что мы имеем сейчас:
<---------------WIDTH-------------->
(DX,AX) UpperLeft
*................................... ^
.............................o...... o is (SI,DI) TestPixel |
.................................... HEIGHT
.................................... |
...................................* v
(BX,CX) BottomRight
Пиксель попадает в прямоугольник, если
DX <= SI <= BX
и AX <= DI <= CX
, что в переводе означает:
mov word [bp+10], 0 ; LOCATION IS NOT IN BORDER
cmp dx, si
ja Outside
cmp si, bx
ja Outside
cmp ax, di
ja Outside
cmp di, cx
ja Outside
inc word [bp+10] ; LOCATION IS IN BORDER
Outside:
; all the pops that you need ...
ret 6