Дефект сортировки пузырьков с использованием встроенного кода сборки

89
8

Я делаю функцию сортировки пузырьков в коде сборки для моего класса компьютерных систем.

Моя функция выглядит так:

 int sorter(int* list, int count, int opcode) {
__asm {
mov ebx, opcode ; opcode in ebx
push 0 ; outer count
mov ecx, 0 ; start ecx at 0 to start loop
mov esi, list ; set esi to list value/ starting address
jmp iloop ; jump to inner loop
oloop: //OUTER LOOP
push ecx ;
mov ecx, 0 ; put the 2nd value in the list in the inner loop count
iloop: // inner loop
mov edx, dword ptr[esi + 4 * ecx]; move first value in edx
mov eax, dword ptr[esi + 4 + 4 * ecx]; move next value in list to eax
cmp ebx, 2 ; compare opcode with 2
je dsnd ; if opcode is equal to 2 then we are using descending order
cmp eax, edx ; compare values at eax and edx
jg no_swap ; if value is greater eax(2nd value) then dont swap /ascending order
cont: //continue from descend
push edx ; push contents of edx to stack
pop dword ptr[esi + 4 + 4 * ecx]; pop the contents on stack to address of value in eax
push eax ; push value in eax to stack
pop dword ptr[esi + 4 * ecx]; pop value on stack to address of value previously in eax
no_swap: //no value swap
inc ecx ; increment inner count
cmp ecx, count ; compare inner loop count to acutal length
jne iloop ; if not equal jump back to inner loop
pop ecx ; get outer count
inc ecx ; to check for n-1 in outer loop
cmp ecx, count ; compare outer loop count to length
jne oloop ; if not equal jump back to outer loop
jmp done ;
dsnd:
cmp eax, edx ; compare values at eax and edx
jl no_swap ; if value is less then dont swap
jmp cont ; continue with loop

done:
}

Если opcode равен 1 для возрастающей сортировки или 2 для убывающего порядка, list - это указатель на список int, а count - количество int в списке

Для восходящей сортировки моя программа работает нормально, но с нисходящим я имею проблемы, как показано в этих тестовых прогонах:

input 10 -20 5 12 30 -5 -22 55 52 0
Number of integer = 10
Ascend_or_Descend = 1
-22 -20 -5 0 5 10 12 30 52 55 # correct

input 48 -24 48 -24 10 100 -10 60 -256 10 -10 4096 -1024 60 10 -10
Number of integer = 16
Ascend_or_Descend = 1
-1024 -256 -24 -24 -10 -10 -10 10 10 10 48 48 60 60 100 4096 # correct

input 10 -20 5 12 30 -5 -22 55 52 0
Number of integer = 10
Ascend_or_Descend = 2
4283780 55 52 30 12 10 5 0 -5 -20 # incorrect

input 48 -24 48 -24 10 100 -10 60 -256 10 -10 4096 -1024 60 10 -10
Number of integer = 16
Ascend_or_Descend = 2
1500056 4096 100 60 60 48 48 10 10 10 -10 -10 -10 -24 -24 -256 # incorrect

Кажется, он принимает самое низкое значение и свопит его по адресу. Я не специалист по сборке.

спросил(а) 2015-07-10T22:18:00+03:00 5 лет, 11 месяцев назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема