2010-10-27 156 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