气泡在装配中排序

时间:2010-10-27 04:01:55

标签: sorting assembly bubble-sort

我正在尝试使用程序集来排序字符串数组。我比较第一个和第二个字母,然后按字母顺序重新排列它们。我几乎想通了,但我的输出正在重新排列一些字符错误。例如,当打印'8'时,它只会打印'eigh'。

.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 个答案:

答案 0 :(得分:1)

发生的事情是你要比较两个字符串的第一个字母,然后使用'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