【问题标题】:Checking if two tiles are touching and are adjacent in NASM Assembly检查两个瓷砖是否在 NASM 组装中接触并相邻
【发布时间】:2013-11-02 12:25:07
【问题描述】:

假设我有一个二维数组,我想检查一个插槽是否相邻并与另一个插槽接触。

假设坐标在 4 字节变量中:OneXOneYTwoXTwoY

我有一段时间的解决方案是,如果你有差异 OneX - OneYTwoX - TwoY 并添加它们,如果结果是 1-1,那么是的,插槽是相邻且接触的.

mov EBX,[oneX]
sub EBX,[oneY]
mov ECX,[twoX]
sub ECX,[twoY]
add EBX,ECX
; Compare EBX with 1 or -1.......

这几乎可行。但没有 - 给定格式 (x,y),取:(3,3) 和 (0,1)。它们显然不相邻也不接触,但函数会说它们是。

Get adjacent elements in a two-dimensional array? 的问题有点用处,但它侧重于查找所有相邻的匹配项,而我想检查两个特定的插槽。

我的数组结构是这样的:

map: dd 'a','b','c','d'  ; Double words just to make my life easier

解释如下

a b
c d

这是一张方形地图。

【问题讨论】:

    标签: algorithm assembly nasm


    【解决方案1】:

    这里是一些实用的代码,基于@libik 的回答:

    针对速度进行了优化:

    ; eax = OneX-TwoX; ecx = OneY-TwoY
            mov    eax, [OneX]
            mov    ecx, [OneY]
            sub    eax, [TwoX]
            sub    ecx, [TwoY]
    
    ; eax = abs(eax); ecx=abs(ecx)
            mov    ebx, eax
            mov    edx, ecx
            sar    ebx, 31
            sar    edx, 31
            xor    eax, ebx
            xor    ecx, edx
            sub    eax, ebx
            sub    ecx, edx
    
    ; eax=abs(delta1)+abs(delta2); if eax = 1, jump to where needed
            add    eax, ecx
            dec    eax
            lz     .adjacent 
    

    尺寸优化:

    ; eax = abs(OneX-TwoX); ecx = abs(OneY-TwoY)
            mov    eax, [OneX]
            mov    ecx, [OneY]
            sub    eax, [TwoX]
            jns    @f
            neg    eax
    @@:
            sub    ecx, [TwoY]
            jns    @f
            neg    ecx
    @@:
    ; eax=abs(delta1)+abs(delta2); if eax = 1, jump to where needed
            add    eax, ecx
            dec    eax
            lz     .adjacent 
    

    包括对角线情况

    add eax, ecx 替换为or eax, ecx

    【讨论】:

      【解决方案2】:

      没有理由添加它们!而且您还减去了不正确的变量:)。

      您必须有两个条件 OneX - TwoXOneY - TwoY :两者都必须是 1、0 或 -1。

      例如,一是 [4,5],二是 [5,5] >= OneX - TwoX = -1OneY - TwoY = 0 => 它是相邻的瓷砖。

      编辑:对于非对角线,有两种方法:

      a)其中一个条件必须为 0,另一个条件必须为 1 或 -1

      b)将OneX - TwoX的绝对值和OneY - TwoY的绝对值相加必须为1

      【讨论】:

      • 如果我想禁用对角线检查怎么办?例如,我不希望 (1,2) 和 (2,1) 评估为真。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多