Bubble Sort in Assembly - PullRequest
       22

Bubble Sort in Assembly

0 голосов
/ 27 октября 2010

Я пытаюсь разобраться в сортировке массива строк с использованием ассемблера.Я сравниваю первый и второй алфавиты, а затем переставляю их в алфавитном порядке.Я почти понял это, но мой вывод неправильно переставляет некоторые символы.Например, при печати «восемь» будет напечатано «восемь».

.386
public _Sort
.model flat
.code
_Sort proc
 push ebp
 mov ebp, esp
 push esi
 push edi
 mov ecx, 10
 mov eax, 1
 dec ecx

L1:
 push ecx
 mov esi, [ebp+8]  

L2:
 mov al, [esi]
 cmp [esi + 20], al
 jg L3
 mov eax, [esi]
 xchg eax, [esi + 20]
 mov [esi], eax

L3: 
add esi, 20
loop L2
pop ecx
loop L1
L4:
pop edi
pop esi
pop ebp 

ret
_Sort endp
end
#include <iostream>
using namespace std;
extern "C" int Sort (char [] [20], int, int);
void main ()
              { 
         char Strings [10] [20]  = { "One",

                                     "Two",

                                     "Three",

                                     "Four",

                                     "Five",

                                     "Six",

                                     "Seven",

                                     "Eight",

                                     "Nine",

                                      "Ten" };
 int i;
 cout << "Unsorted Strings are" << endl;
 for (i = 0; i < 10; i++)
  cout << '\t' << Strings [i] << endl;
 Sort (Strings, 10, 20);
 cout << "Sorted Strings are" << endl;
 for (i = 0; i < 10; i++)
  cout << '\t' << Strings [i] << endl;
 }

1 Ответ

1 голос
/ 27 октября 2010

Происходит то, что вы сравниваете первые буквы двух строк, а затем используете инструкцию 'xchg' для обмена первыми четырьмя буквами каждой строки.

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

Кроме того, я не уверен в ваших циклах и в том, выполняются ли они правильное количество раз. В общем, старайтесь не использовать инструкцию 'loop', используйте явные условные переходы, такие как jnz, они быстрее.

редактировать:

 mov eax, [esi] 
 xchg eax, [esi+20] 
 mov [esi], eax

 mov eax, [esi+4] 
 xchg eax, [esi+24] 
 mov [esi+4], eax

 mov eax, [esi+8] 
 xchg eax, [esi+28] 
 mov [esi+8], eax

 mov eax, [esi+12] 
 xchg eax, [esi+32] 
 mov [esi+12], eax

 mov eax, [esi+16] 
 xchg eax, [esi+36] 
 mov [esi+16], eax
...