Assembly 如何将数字型位置转换为x、y型位置?

Assembly 如何将数字型位置转换为x、y型位置?,assembly,x86-16,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

当我想检查某个位置是否在“迷你边界”内时,我希望效率更高。我检查了边境上每个可能的位置,并将其与实际位置进行了比较

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
例如,当我想检查一个位置是否为独立矩形时, 我提供了左上角的位置、宽度和长度。然后,将一个像素位置后的像素位置与实际位置进行比较

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
首先,让我们准确一点 您所命名的长度实际上是宽度,因为它指的是水平方向。
您所命名的宽度实际上是高度,因为它指的是垂直方向

即使宽度比高度长得多,并且很容易谈论长度和宽度,这仍然是正确的

还要注意,同样的混淆在代码中引入了一个数字错误(
[bp+6]
vs
[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)

这就是我们现在所拥有的:

   <---------------WIDTH-------------->
(DX,AX) UpperLeft       
   *...................................                              ^
   .............................o......     o is (SI,DI) TestPixel   |
   ....................................                            HEIGHT
   ....................................                              |
   ...................................*                              v
                                   (BX,CX) BottomRight

你不能检查一下像素坐标是否在矩形坐标的范围内吗?您的矩形将具有坐标(左,顶部)和(右,底部)。将(x,y)勾选为x>=左侧,x=顶部和y
    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