J'essaie de stocker la saisie de l'utilisateur dans un tableau, mais lorsque j'utilise SW, je reçois une erreur "L'adresse du magasin non alignée sur le mot lié". Mon objectif est de lire dans 10 entiers de la matrice, mais après avoir saisi le premier chiffre, je reçois une erreur à la commande SW. Je ne sais pas ce que je fais mal, j'ai passé quelques heures à essayer de le comprendre. Toute aide sera grandement appréciée et marquée utile. Ceci a fonctionné pour moi. Je ne sais pas pourquoi cela ne fonctionne pas au-dessus de p>
6 Réponses :
Essayez ceci:
... .p2align 2 array: .space 40 #10 element integer array ...
Cela n'a rien changé. Merci de répondre cependant.
Avez-vous eu une erreur de compilation? .p2align 2 code> est censé aligner le code / données suivants sur une adresse d'une puissance de 2 (2 ^ 2 = 4 ici). Et si vous ajoutez un à trois caractères supplémentaires à la chaîne code> code>? Cela pourrait corriger l'alignement du tableau code> aussi.
Le magasin doit être p>
sw $ v0, tableau ($ t0) p> li>
Remplacer Définissez le tableau ci-dessus En outre, lorsque vous atteignez 10 éléments, vous redémarrez la lecture et écrasez les valeurs précédentes. P> LA $ T0, 0 code> par
LI $ T0, 0 code> p> li>
mess code> p> li>
ul>
Essayez d'allouer de l'espace pour votre tableau avant d'allouer de l'espace pour votre chaîne dans le segment de données: Si vous allouez d'abord la chaîne d'abord, la matrice peut commencer à une adresse qui n'est pas divisible par 4 et conduire à une erreur d'alignement de mots p> p>
code d'entrée de tableau approprié strong>
Veuillez utiliser le formatage de Markdown pour que cela soit plus lisible. Et s'il vous plaît ajouter des explications, afin d'aider à combattre la mauvaise idée que Stackoverflow est un service de rédaction de code gratuit.
.data array: .space 128 #Max capacity of array to hold 32 integer elements prompt1: .asciiz "Enter the number of integers of the unsorted list: " prompt2: .asciiz "Enter the integer values of the unstored list : " .text #Prompt user to enter the number of integers in the original unsorted list: li $v0 , 4 la $a0, prompt1 syscall #Get the user's entered number li $v0, 5 syscall #Storing the input in temporary registers move $t0, $v0 la $t9 , array #Prompt user to enter the integer elements of the unsorted list: li $v0, 4 la $a0, prompt2 syscall jal read j nowSort read: li $t1, 0 #count variable j readLoop jr $ra readLoop: beq $t1, $t0, andbeyond #branch if equal to the size of array li $v0, 5 #read int syscall move $t9 , $v0 #store input in array addi $t9, $t9, 4 #move the address to the next location in array addi $t1, $t1, 1 #add by 4 to count j readLoop andbeyond:
Le code est beaucoup plus utile quand il est accompagné d'une explication. Le débordement de la pile concerne l'apprentissage, ne fournissant pas d'extraits de copier aveuglément et de coller. S'il vous plaît Modifier votre question et expliquez comment il répond à la question spécifique posée. Voir Comment répondre .
Pourquoi sautez-vous sur un JR $ PA inaccessible code>? Votre programme fonctionnerait la même chose si vous avez supprimé cela et le
j LisTloop code> juste avant. En outre,
Déplacer $ T9, $ V0 code> ne stocke pas en mémoire, il suffit de copie un registre. On dirait que vous voulez
SW code>.
Le code suivant lira en entrée à partir de l'utilisateur en haut de la quantité dans laquelle ils entrent, s'ils veulent entrer 10 entiers, l'entrée initiale doit être de 10. Il incitera ensuite à l'utilisateur de remplir les entiers une à la fois. Une fois que le tableau initial sera imprimé.
Un projet de mien devait que je dispose de la fonctionnalité de tri afin qui soit implémentée dans la deuxième partie du code à échanger pour mettre en œuvre le tri de la commande ascendant. Toute clarification me contacter. P>
.data inputLabel: .asciiz "Enter the amount of integers in the array: " myArray: .space 100 arrayToBeSorted: .asciiz "Enter the array to be sorted one at a time: " nextLine: .asciiz "\n" original: .asciiz "You have entered: " result: .asciiz "Here is the sorted list in ascending order: " .text .globl main main: #print input label li $v0, 4 la $a0, inputLabel syscall #read amount of integers to be inputed. li $v0, 5 syscall addi $t0, $v0, 0 #put input into $t0, number of integers in array addi $t7, $t0, 0 li $t4, 4 #mul $t5, $t0, $t4 #ask user to input numbers of the arrayToBeSorted li $v0, 4 la $a0, arrayToBeSorted syscall li $t6, 0 #used to index array at insertion j loop0 #read the numbers loop0: #loop successfully reads in n integers and stores them in a list #check if 0 == input; beq $t7, 0, next #take in user input li $v0, 5 syscall #store user input into list sw $v0, myArray($t6) #add 4 to the index of the list addi $t6, $t6, 4 #sub 1 from the number of items to add to list addi $t7, $t7, -1 #loop j loop0 next: #success print move $t0, $t6 li $v0, 4 la $a0, original syscall j while while: #printer success #print new line li $v0, 4 la $a0, nextLine syscall beq $t6, $zero, swap #dif i is 0 then exit lw $t1, myArray($t3) #load in my array at index i #printing int at myArray[i] li $v0, 1 move $a0, $t1 syscall addi $t3, $t3, 4 addi $t6, $t6, -4 j while swap: la $t4, myArray #loads A[0] myArray to $t4 la $t1, myArray #loads A[1] array to $t1 addi $t1,$t1,4 #add 4 to $t1, save to $t1 la $t8,myArray #loads A[n] array to $t8 add $t8,$t0,$t8 #add $t8 to $t0, save to $t8 la $t9,myArray add $t9,$t0,$t9 #add $t9 to $t0, save to $t9 addi $t9,$t9,-4 #subtracts 4 from $t9, save to $t9 A[n-1] loop: lw $t2,($t4) #load A[0] input into $t2 lw $t3,($t1) #load A[1] input into $t3 blt $t2,$t3,loop1 # dif $t2 < $t3, A[0]<A[1]go to loops sw $t3,($t4) #store $t3 in $t4 A[1] = A[0] sw $t2,($t1) #store $t2 in $t1 A[0] = A[1] loop1: addi $t1,$t1,4 #add 4 to $t1, save to $t1 A[1] + 4 becomes A[2] blt $t1,$t8,loop #dif $t1<$t8, go to loop A[2] < A[n] addi $t4,$t4,4 #add 4 to $t4, save to $t4 move $t1,$t4 addi $t1,$t1,4 #add 4 to $t1, save to $t1 blt $t4,$t9,loop #idf $t4<$t9, to go loop print: la $a1,myArray #loads myArray to $a1 la $a0, result #loads output to $a0 li $v0, 4 #loads 4 into #v0 syscall la $a0, nextLine #loads nextLine into $a0 li $v0, 4 #loads 4 into $v0 syscall loop2: blez $t0, done #if $t0<=0, go to done li $v0, 1 #loads 1 into $v0 lw $a0, 0($a1) #load an inout into $a0 syscall la $a0, nextLine #loads nextLine into $a0 li $v0, 4 #loads 4 into $v0 syscall addi $a1, $a1, 4 #add 4 to $a1, save to $a1 addi $t0, $t0, -4 #subtracts 4 from #t0, save to $t0 j loop2 done: li $v0, 10 syscall j done
Commentaires comme Ajouter $ T8, $ T0, $ T8 #Ajouter $ T8 à $ T0, enregistrer à $ T8 code> ne sont que redondants, pas utiles. Réitérant comment la syntaxe MIPS fonctionne pour chaque instruction normale est encombrée qui distrait de utile i> commentaires comme
addi $ t9, $ T9, -4 # adresse d'un [n-1] code>. En outre, certains de vos commentaires sous la partie où je suis arrivé à regarder,
Swap: code>, ce sont faux.
La $ T1, myarray code> ne charge pas
a [1] code>, et ne charge même pas l'adresse i> de
A [1 ] code>. C'est l'adresse de
A [0] code>, identique à laquelle vous avez eu du
la $ T4, myarray code>.
Vous faites le même la code> 4 fois dans une boucle sans raison apparente; Vous pouvez garder cela dans un reg que vous avez mis une fois en dehors de la boucle et que vous faites des trucs comme
addu $ t1, $ T8, $ t0 # myarray + n_byte_offset code>. (Notez comment le commentaire explique la signification I> Semantic i> en termes d'un niveau de logique plus haut, à l'aide de noms de variables, au lieu de répéter les noms de registre, car vous pouvez le voir à partir de l'instruction elle-même.)
Aussi, vous pouvez et devez utiliser des trucs comme lw $ t2, 4 ($ T4) code> au lieu d'utiliser un
distinct (code> addiu code> pour compenser un enregistrement d'un pointeur.
LW CODE> /
SW CODE> est Type I, en prenant un décalage immédiat de 16 bits à partir du registre, vous devez donc seulement dépenser des instructions sur le calcul de l'adresse avec des variables d'exécution.