gpt4 book ai didi

assembly - 如何将数字类型位置转换为x,y类型位置?

转载 作者:行者123 更新时间:2023-12-03 06:37:05 25 4
gpt4 key购买 nike

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

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

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

最佳答案

首先我们要准确

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

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

另请注意,同样的混淆在您的代码中引入了数字错误( [bp+6][bp+8] )。

然后解决问题

How to make a number type location to x,y type location

当前您的程序使用(偏移)地址来引用像素。很容易将该地址转换为 (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 <= BXAX <= 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

关于assembly - 如何将数字类型位置转换为x,y类型位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55920789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com