Проверьте, совпадает ли значение в EAX с любым значением в массиве x86 - PullRequest
2 голосов
/ 12 октября 2011

Я пытаюсь проверить, совпадает ли случайное значение, сгенерированное в 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

Заранее спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Я получаю только пустой экран окна 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:)

0 голосов
/ 12 октября 2011

Вы просматриваете один массив несколько раз, не меняя его? Длина массива больше восьми-десяти? Если это так, самый быстрый способ сделать это с помощью алгоритма - создать массив и отсортировать его во внешнем цикле, а затем всякий раз, когда вы захотите выполнить поиск во внутреннем цикле, выполните бинарный поиск. Двоичный поиск - O (log n), в то время как прямой линейный поиск, как вы делаете здесь, - O (n).

Также, как совет, сортировка материалов в сборке проста - вызовите qsort. Это действительно не стоит писать свои собственные в машинном коде!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...