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