2

我正在尝试测试 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

提前感谢您的帮助。

4

2 回答 2

2

我只得到一个空白的 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 已经有几年了 :)

于 2011-10-12T08:19:24.113 回答
0

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

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

于 2011-10-12T10:37:57.797 回答