расположение значений в случайном массиве с использованием пузырьковой сортировки x86 - PullRequest
1 голос
/ 13 октября 2011

У меня есть массив dword из 15 случайных целых чисел, который хранится в esi. У меня есть алгоритм сортировки пузырьков ниже, который должен располагать значения от самого низкого до самого высокого. Однако, когда моя программа работает по этому алгоритму, она, кажется, не затрагивает ни одно из значений, и когда я печатаю массив, он точно такой же, как был раньше. Мысли

BubbleSort PROC USES eax ebx ecx edx esi

    mov ecx, 0 
    mov ecx, 15

    OUTER_LOOP: 
        push ecx
        mov ecx,0
        mov ecx,14
        mov esi, OFFSET arr

        COMPARE:
            mov ebx,0
            mov edx,0
            mov bl, [esi]
            mov dl, [esi+1]
            cmp bl,dl
            jg SWAP 

            CONTINUE:      
                add esi,4      
                loop COMPARE

        mov esi, OFFSET arr

        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

BubbleSort ENDP

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

1 Ответ

1 голос
/ 13 октября 2011

EDIT:

Я обнаружил разные проблемы в вашем коде. Я исправил их ниже, и ESI фактически изменился (не отсортирован, потому что я думаю, что алгоритм сортировки неправильный, но у него еще не было времени изменить его)

1- мов рег, 0

Лучше xor регистр вместо перемещения 0 к нему. Инструкция XOR короче.

2- В цикле CONTINUE я использую add esi, 2 (может быть, вы используете 64-битные окна?)

3- В цикле SWAP первые 2 инструкции mov бесполезны. Я удалил их.

4- В цикле SWAP вам нужно поменять строки, в которые вы помещаете значения, обратно в esi и esi + 1 (на самом деле вам даже не нужна инструкция xchg.)

Теперь ESI изменен. Вам нужно поработать над алгоритмом сортировки.

BubbleSort PROC uses ECX
    xor ecx,ecx 
    mov ecx, 15

    OUTER_LOOP: 
        push ecx
        xor ecx,ecx
        mov ecx,14
        mov esi, OFFSET arr

        COMPARE:
            xor ebx,ebx
            xor edx,edx
            mov bl, byte ptr ds:[esi]
            mov dl, byte ptr ds:[esi+1]
            cmp bl,dl
            jg SWAP 

            CONTINUE:      
                add esi,2      
                loop COMPARE

        mov esi, OFFSET arr

        pop ecx     
        loop OUTER_LOOP

    jmp FINISHED

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

    FINISHED:
    ret
BubbleSort ENDP

EDIT: Во внешнем цикле у вас есть 2 mov esi, OFFSET arr

а второй происходит как раз перед выходом. Таким образом, вы в основном возвращаете смещение массива в ESI, как это было в начале.

Примечание USES ESI ниже. Вы должны удалить его.

Кроме того, для чего используется ECX в этой процедуре? Он никогда не используется, но вы присваиваете значения, нажимаете и выводите их?


ИСПОЛЬЗОВАНИЕ eax ebx ecx edx esi

Этот помощник masm помещает ESI в стек.

Когда вы выходите из процедуры, она выскакивает, как и раньше.

Так что вы, вероятно, не хотите включать туда ESI.

Обратите внимание, вы также хотите поместить свой DWORD в другой регистр, например EAX. Есть некоторые случаи, когда ввод процедуры ESI и лайки все равно выталкиваются.

...