le tri de tableau en mips (assemblée)
im dans une classe d'apprentissage de l'assemblée à l'aide de mips. Je suis en train de travailler sur le tri d'un tableau de nombres et je pense que j'ai la méthode fonctionne correctement, mais un peu de difficulté. Je ne sais pas comment vérifier quand im triés entièrement. Im en utilisant un assez rudimentaire méthode de tri, mais c'est tout ce que nous avons appris jusqu'à présent. Aussi, je ne sais pas comment faire pour générer les numéros de vérifier pour voir si elle est triée. Im utilisé pour Java et de telle sorte assemblée est un peu de me lancer pour un spin. Voici mon code donc loin:
.text
.globl main
main: la $a0, Array # sets the base address of the array to $a0
loop: lw $t0, 0($a0) # sets $t0 to the current element in array
lw $t1, 4($a0) # sets $t1 to the next element in array
blt $t1, $t0, swap # if the following value is greater, swap them
addi $a0, $a0, 4 # advance the array to start at the next location from last time
j loop # jump back to loop so we can compare next two elements
swap: sw $t0, 4($a0) # store the greater numbers contents in the higher position in array (swap)
sw $t1, 0($a0) # store the lesser numbers contents in the lower position in array (swap)
li $a0, 0 # resets the value of $a0 back to zero so we can start from beginning of array
j loop # jump back to the loop so we can go through and find next swap
.data
Array: .word 14, 12, 13, 5, 9, 11, 3, 6, 7, 10, 2, 4, 8, 1
merci pour toute aide les gars!
- Ressemble pour moi comme une sorte de tri à bulles. Pourquoi avez-vous sauter au début de la matrice après la permutation? Il suffit de garder la permutation des éléments aussi longtemps que arr[i] > arr[i+1], après chaque itération, un élément de plus est dans sa position finale à la fin du tableau. Avec cette approche, on répète n fois (où n est la longueur du tableau), et vous êtes assuré d'avoir le tableau trié à la fin.
- Aussi, à propos de l'écriture de sortie de l'utilisateur, peut-être que ce sera vous aider: forum.codecall.net/topic/...
- eh bien, si je devais continuer, au lieu d'espérer de retour au début du tableau comment recommandez-vous que je sais à la fin du tableau, et comment pourrais-je savoir quand il est trié?
Vous devez vous connecter pour publier un commentaire.
Ce lien explique comment imprimer à l'écran dans un MIPS simulateur comme QTSPIM ou MARS.
Comme pour le code, il y avait quelques bugs. La ligne
li $a0, 0
est d'écraser le travail effectué par la premièrela $a0, Array
instruction parce que lali
est le réglage de l'adresse de base de votre tableau à 0. Au lieu de cela, vous devez déplacer lesla
instruction dans la boucle de sorte que$a0
est correctement réinitialisé à l'adresse de base deArray
après une itération sur l'ensemble de la matrice, et de supprimer leli
instruction. Vous devrez également ajouter une condition pour que votre programme a terminé le tri. Je vous suggère les modifications suivantes (testé avec SPIM):Assurez-vous de vérifier ce lien pour plus d'exemples et d'explications sur ce que chaque MIPS instruction n'.
Codage direct de l'assemblée est une douleur. Ce que je faire à la place est de commencer avec un algorithme (psuedocode ou code) de traduire systématiquement, comme si je suis un compilateur. Je vais ignorer l'entrée et la sortie des trucs et de se concentrer sur une fonction qui trie.
Vous ferait appel à un haut niveau lanaguage comme C:
où
data
est un tableau d'entiers etN
le nombre d'éléments (il n'y a pas les attributs de taille au niveau des machines).Car les appels de fonction rien, il a besoin d'aucun cadre de pile. Observer la norme MIPS conventions de l'aide
$t
registres, de sorte que vous ne sont pas bousiller quelque chose de quelqu'un d'autre se passe dans les paramètres dans$a0
et$a1
dans cet ordre.Étape 1: obtenir un algorithme. Voici une de [Wikipedia][1] pour le tri par insertion:
Etape 2: coller dans un fichier texte, mettez toutes les lignes dans les commentaires et convertir systématiquement à l'assemblée. J'ai utiliser des modèles pour des choses comme les boucles qui prennent la conjecture hors de codage (voir mon livre gratuit pour des exemples). Je vais juste donner le produit fini ici; appeler, vous avez besoin de mettre l'adresse de début du tableau en
$a0
et sa taille en$a1
, puisjal insertionsort
:Plus longtemps que les autres exemples – mais si vous commencez à partir d'un algorithme et de le traduire, vous êtes moins susceptible de se tromper. Cela peut aller dans un fichier séparé si votre assembleur respecte la
.globl
la directive, ce qui rend le nom visible dans d'autres fichiers.[1]: https://en.wikipedia.org/wiki/Insertion_sort – en fait, à partir de Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001). Article 2.1: le tri par Insertion". Introduction aux Algorithmes (2e ed.). MIT Press et McGraw-Hill. pp. 15-21
j
à la condition de la boucle du bas. Ou vous pouvez peler check-pour-zéro-itérations au lieu de sauter dans la boucle, tels que les compilateurs d'habitude, c'est commeif(foo) { do{}while(foo); }
. Pourquoi boucles toujours compilé dans "do...while" style " (queue de saut)?. +1 pour une belle façon systématique pour convertir pseudo-code en asm avec des variables dans les registres et propre structure de boucle. Même si le pointeur de incréments sont mieuxaddi $t4, $t4, 4
devrait être remplacé par le décalage dans le prochain mode d'adressage, comme4($t4)
au lieu de0
. Aussi, en utilisant seulement de l'octet des décalages de tous les temps serait de supprimer beaucoup de changement. Ou encore mieux, fairei
etj
pointeurs au lieu d'indices: tout fonctionne de la même manière, sauf que vous n'avez pas à ajouter à la base de la matrice. Au lieu de comparer à l'encontre de 0 et de longueur, de vous comparer à l'encontre de base et une fin de pointeur de vous calculer une seule fois. (MIPS abltz
dans le matériel, de sorte que vous ne manquez que.).les données
valeur: .mot 0x3
Tableau: .mot 0x14, 0x12, 0x13, 0x05
.texte
.globl principal
principaux: la $a0, Tableau
l1: lw $t0, 0($a0)
swap: sw $t0, 4($a0)