2011-04-06 40 views
1

所以我在此基礎上高一級的代碼我編碼了一個插入排序(彙編):插入排序在大會

void insertionSort(int data[ ], int arraySize) { 
     int insert; 
     int moveItem; 
     for(int next=1; next<arraySize; next++) { 
        insert=data[next]; //store the value in the current element 
        moveItem=next; //initialize location to place element 

        while((moveItem>0)&&(data[moveItem-1]>insert)) { 
           //shift element one slot to the right 
           data[moveItem]=data[moveItem-1]; 
           moveItem--; 
        } //end while 

        data[moveItem]=insert; 
     } //end for 
} //end insertionSort 

中有名爲myArray的數組整整20個隨機數。我不能使用本書附帶的圖書館中的決策衍生工具。所以基本movs,cmps,循環和跳 這就是我得到的。我已經把它排序了20個隨機數中的第一個,但我已經把自己弄糊塗了,不知道我在做什麼。它在到達插入排序方法時崩潰。請幫助。

TITLE Insertion Sort (main.asm) 
INCLUDE Irvine32.inc 
.data 

elems = 20 

myArray sdword elems dup(0) 
str1 byte "Press enter" ,0 
str2 byte "The array now is ",0 
next sdword 1 
start sdword ? 

.code 
main PROC 
    call Clrscr 
    call CreateRandom 
    call Display 
    call InsertionSort 
    call Display 
    exit 
main ENDP 

CreateRandom PROC 
;;;;Creates 20 random numbers and populates myArray;;;;; 
    call Randomize 
    mov ecx, 20 
    mov edx, OFFSET myArray 

L1:      
    call Random32     ;create random number 
    mov [edx], eax     ; move random number to the appropriate spot in the array 
    add edx, 4      ; increase the address of what it is pointing to 
    loop L1 
    mov edx, OFFSET str1   ; "press enter to continue" 
    call WriteString 
    call ReadInt 
    call Crlf 
    ret 
CreateRandom ENDP 

Display PROC 
;;;; Displays current form of the array myArray;;;;; 
    mov edx, OFFSET str2    ; "The array now is:" 
    call WriteString     ; write string 
    call Crlf 
    mov esi, OFFSET myArray    ; offset of the array 
    mov ecx, 20       ; index of the loop 
L2: 
    mov eax, [esi]      ; move array at that point to eax 
    call WriteDec      ; print out the array as a decimal 
    call Crlf       ; next line 
    add esi, 4       ; next element in the array 
    loop L2 
    call Crlf 
    ret 
Display ENDP 

InsertionSort PROC 
mov ecx, 19 
mov edx, OFFSET myArray 
mov ebx, OFFSET myArray   ; eax=next 
add ebx, 4      ;moves up the array to second element comparable to next 

outterloop: 
    mov esi, [ebx]     ; esi=data[next] 
    mov eax, ebx    ;movelterm=ebx 
    L1: 
     mov edx, [eax-4]   ;move the number that is greater into edx 
     mov [eax], edx    ;move the number into that 2nd element of the 
     sub eax, 4 
     mov esi, [eax] 
     cmp eax, [edx] 
     JNG endinner      ; if the address is not greater than the first address, skip to the end 
     mov edx, [eax-4] 
     cmp edx, esi      ; if the address is greater, than it already sorted, skip to end 
     JG endinner 
     loop L1 
    endinner: 
     mov [eax], esi ; move first to the second to finish the sort 
     add ebx, 4 ;move to the next element of the array 
    inc next ;counting outside loop 
     cmp ecx, next 
     JNE outterloop ;return to top of for loop 

ret 
InsertionSort ENDP 

END main 
+2

一個勇敢的靈魂是誰去「這是171彙編程序的行,怎麼了? :-)只是在說'... – corsiKa 2011-04-06 23:29:30

回答

1

我沒有詳細研究你的代碼,但我注意到,InsertionSort好像是用edx一次爲兩個不同的目的:作爲一個指針到數組,並保持在該值中的一個陣列。即使沒有其他錯誤,這肯定會破裂。

所以,在InsertionSort的開頭你說mov edx, OFFSET myArray - 它是一個指向數組的指針。然後,幾行後,mov edx, [eax-4] - 哎呀,不,這是來自陣列的值。再後面幾行,cmp eax, [edx] - 哦,不,現在它又是一個指向數組的指針。

也許最後的指令應該是cmp edx, [eax]什麼的?因爲eax似乎是這裏的數組指針。

+0

我已經解決了你提到的問題,但它不能解決我的問題。我也嘗試在cmp中使用[eax],並且它似乎會引發錯誤。此外,有兩個寄存器開始與該數組的偏移量,但我需要偏移量稍後再檢查,我沒有離開該數組的邊界。看起來更有點像現在這樣:我 L6: \t \t CMP ESP,ESI \t \t \t \t \t \t \t \t JG endinner MOV EBP,[EAX-4] MOV [EAX],EBP 子EAX ,4 \t \t CMP EAX,EDX \t \t JNG endinner \t \t \t \t \t \t \t \t MOV ESP,[EAX-4] \t \t環L6 – michelle 2011-04-06 23:48:50

+0

我不認爲這是調試只給出了信息的代碼是可行的,它「看起來更有點像這樣」!您能否更新問題中的代碼以反映您所做的任何修復? – 2011-04-06 23:56:59

+0

(但它聽起來好像在你真正設置它之前使用'esp'。) – 2011-04-06 23:59:46