Insertion sort in der Montage
So, ich bin die Codierung aus einer insertion sort (in der Montage) basiert auf diesem hohen Niveau-code:
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
Sind es genau 20 zufällige zahlen in ein array mit dem Namen myArray. Ich kann nicht verwenden Sie eine der Entscheidung Derivate, die kommen in die Bibliothek, kommt mit unserem Buch. Also im Grunde movs, cmps, Schleifen und Sprünge
Hier ist, was ich bekam. Ich hatte es Sortieren die ersten 20 Zufallszahlen früher, aber ich habe das verwirrt mich zu Tode und habe keine Ahnung was ich mache, nicht mehr. Es stürzt ab, wenn er bekommt, um die insertion sort-Methode. Hilfe bitte.
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
Eine tapfere Seele ist derjenige, der geht "Hier ist 171 Zeilen assembler, was ist Los?" 🙂 Just sayin'...
InformationsquelleAutor michelle | 2011-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich nicht geprüft, den code im detail, aber ich merke, dass
InsertionSort
zu sein scheint, mitedx
für zwei verschiedene Zwecke auf einmal: als ein Zeiger in das array, und halten Sie einen der Werte aus dem array. Dies wird sicherlich brechen, auch wenn sonst nichts, ist falsch.So, am Anfang
InsertionSort
Sie sagenmov edx, OFFSET myArray
- es ist ein Zeiger auf das array. Dann, wenige Zeilen spätermov edx, [eax-4]
- Huch, Nein, das ist ein Wert aus dem array. Und ein paar Zeilen später wiedercmp eax, [edx]
-- oh Nein, jetzt ist es ein pointer in das array wieder.Vielleicht, dass die Letzte Anweisung sollte
cmp edx, [eax]
oder so? Daeax
scheint, einen Zeiger in das array hier.Ich glaube nicht, dass es machbar ist das Debuggen des Codes erhält nur die Informationen, die es "sieht ein wenig mehr wie diese"! Könnten Sie bitte aktualisieren Sie den code in die Frage zu reflektieren, was Updates, die Sie gemacht haben?
(Aber es klingt so, als wenn Sie mit
esp
bevor Sie eigentlich eingestellt habe.)Auch, wenn ich mich richtig verstehen, was gemeint ist, werden in
esp
ich denke, dein Vergleich sofort nachL6
ist der falsche Weg um.InformationsquelleAutor Gareth McCaughan