【问题标题】:Test if value in EAX is the same as any value in a array x86测试 EAX 中的值是否与数组 x86 中的任何值相同
【发布时间】:2011-10-12 07:56:38
【问题描述】:

我正在尝试测试 eax 中生成的随机值是否与我分配的数组中的任何值相同。外部循环生成数组并将其写入屏幕和数组中,然后内部循环应该测试该值是否存在于数组中。我知道我没有正确执行内部循环,但我不确定如何修复它。

它组装得很好,但是当我尝试运行时,我只得到一个空白的 cmd 窗口屏幕。我也在使用 Irvine32 库。我的代码如下:

编辑:到目前为止,我感谢你们的帮助,但现在我有两个问题。第一个是当我尝试针对我的数组评估 eax 中的数字的唯一性时,我实际上得到了访问冲突错误。我生成数组并对其进行测试的代码如下:

RandomArray PROC uses EAX

    call Randomize 
    mov esi, OFFSET arr
    mov edi, OFFSET arr
    mov ebx, TYPE arr 
    mov ecx, 15
    L1:
        mov eax, [79 - 19]
        push eax
        call RandomRange
        add eax, 19
        search1:
                 mov edx,[esi]
                 cmp eax,edx                 ; compares the values in the array and the random int
                 je L1                       ; jumps if the values are equal
                 add esi,4                   ; moves to next byte to check again
                 loop search1                ; repeats loop
        mov [esi],eax
        pop eax
        add esi, ebx
        loop L1
    ret
RandomArray ENDP
        pop ecx     
        loop OUTER_LOOP

    jmp FINISHED

    SWAP:
        mov bl, [esi]
        mov dl, [esi+1]
        xchg bl,dl 
        mov [esi],dl 
        mov [esi+1],bl
        jmp CONTINUE 

    FINISHED:
    ret

提前感谢您的帮助。

【问题讨论】:

  • 它非常有问题,并且会永远循环。如果找到匹配项,它将跳回来并重新做所有事情。如果没有找到匹配项,那么它将重新加载 cx,因此它永远不会倒数到零。使用调试器。
  • 看起来他们正在等待SCAS 指令。

标签: assembly x86 masm irvine32


【解决方案1】:

我只得到一个空白的 cmd 窗口屏幕

search:
    mov ecx,elementcount
    cmp eax,[esi]
    je L1
    add esi,4
    loop search

这是一个无限循环,因为您在每次迭代时都会重置计数器 ecx。将 ecx 赋值移到循环之外,你应该没问题:

mov ecx,elementcount

search:
    cmp eax,[esi]
    je L1
    add esi,4
    loop search

顺便说一句,你可以用rep scasd 替换那个循环,我相信它会做同样的事情。不确定它是否以任何方式“更好”。

mov ecx,elementcount
rep scasd
je L1

免责声明:代码未经测试,我已经有几年没有做 x86 asm 了:)

【讨论】:

  • 虽然你的建议有助于澄清一些事情,但我尝试了不同的技术,因此我编辑了我的帖子。
【解决方案2】:

您是否多次查找单个数组而不更改它?数组的长度是否超过八到十个?如果是这样,在算法方面最快的方法是创建数组并在外循环中对其进行排序,然后每当您想在内循环中进行查找时进行二进制搜索。二进制搜索是 O(log n),而像你在这里做的直线搜索是 O(n)。

另外作为提示,在汇编中对内容进行排序很容易 --- 调用 qsort。真的不值得用机器码自己写!

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2023-03-25
    • 2020-05-27
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多