2010-10-27 108 views
0

我想弄清楚使用程序集对字符串数组进行排序。我比较第一个和第二个字母,然后按字母顺序重新排列。我已经知道了,但是我的输出却错误地重新排列了一些字符。例如,打印'八'时,它会打印'唉'。气泡排序装配

.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; 
} 
+0

如果它让你考虑一个更好的算法,你是幸运的,这是行不通的。 – 2010-10-27 04:18:07

回答

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 
+0

你的意思是不是用[esi + 20],用[esi +4]然后用+8,+12,+16,+20 ...你能举出一个你说过的话的例子吗 – justbrianr 2010-10-27 04:17:15