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.