如何将数字类型位置设置为x,y类型位置

时间:2019-04-30 12:15:49

标签: assembly x86-16

我想更有效。当我要检查某个位置是否在“迷你边框”内时。我正在检查边界中的每个可能位置,并将其与实际位置进行比较。

例如,当我要检查某个位置是否独立于矩形时, 我正在输入左上角的位置,宽度和长度。然后,将像素位置之后的像素位置与实际位置进行比较。

PROC CHECK_IF_IN_BORDER
;THIS PROC IS CHECKING IF THE LOCATION IS INSITE AN RECTANGLE THAT ITS 
;TOP LEFT CORNER IOS TOP_LEFT LOCATION OF BORDER AND ITS LENGTH 
;AND WIDTH ARE SIMILAR TO WHAT YOU RECIVE FROM THE USER

;----------------GET-------------------;
;BP + 4 - TOP LEFT LOCATION OF BORDER  ;
;BP + 6 - LENGTH               ;    
;BP + 8 - WIDTH                ;    
;BP + 10 - LOCATION            ;    
;--------------------------------------;

;------------RETURN--------------------;
; 1 - IF LOCATION IS IN BORDER         ;
; 0 - IF LOCATION IS NOT IN BORDER     ;
;--------------------------------------;
    PUSH BP
    MOV BP,SP
    PUSH AX
    PUSH DX
    PUSH BX

    MOV BX, 0 
    MOV AX,[BP+10]
    CHECK_NEXT_LINE1:   
        MOV DX,0 
        CHECK_LINE1:
            CMP AX,[BP+4]
            JE IN_BORDER1
            INC AX
            INC DX
        CMP DX,[BP+8] ;LENGTH
        JNE CHECK_LINE1
        ;----------------
        SUB AX,[BP+8] ;LENGTH
        ADD AX,320
        ;----------------
        INC BX
    CMP BX, [BP+6] ;WIDTH
    JNE CHECK_NEXT_LINE1
    ;NOT IN_BORDER:
        MOV [BP+10], 0 
        JMP SOF_BORDERPROC1
    IN_BORDER1:
        MOV [BP+10], 1 
    SOF_BORDERPROC1:
    POP BX
    POP DX
    POP AX
    POP BP
    RET 6 
ENDP CHECK_IF_IN_BORDER

1 个答案:

答案 0 :(得分:2)

首先,我们要准确

您命名为 LENGTH 的实际上是 WIDTH ,因为它是指水平方向。
您命名的 WIDTH 实际上是 HEIGHT ,因为它是指垂直方向。

即使宽度比高度长得多,并且很容易谈论长度和宽度,这一点仍然适用。

还要注意,同样的困惑也导致了代码中的数字错误([bp+6][bp+8])。

然后解决问题

  

如何将数字类型位置设置为x,y类型位置

当前,您的程序使用(偏移)地址来引用像素。将此地址转换为(x,y)坐标很容易。它所要做的就是除以屏幕扫描线的长度。商({{1)}给出y坐标,余数(AX)给出x坐标。

DX

矩形右下角的坐标为

(BottomRightX,BottomRightY)=(TopLeftX +宽度-1,TopLeftY +高度-1)

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

这是我们现在拥有的:

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