8
votes

MIPS - Stockage des intents dans la matrice de l'entrée de l'utilisateur

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. XXX

Ceci a fonctionné pour moi. Je ne sais pas pourquoi cela ne fonctionne pas au-dessus de xxx


0 commentaires

6 Réponses :


1
votes

Essayez ceci:

...
.p2align 2
array: .space 40    #10 element integer array
...


2 commentaires

Cela n'a rien changé. Merci de répondre cependant.


Avez-vous eu une erreur de compilation? .p2align 2 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 ? Cela pourrait corriger l'alignement du tableau aussi.



2
votes
  • Le magasin doit être

    sw $ v0, tableau ($ t0)

  • Remplacer LA $ T0, 0 par LI $ T0, 0

  • Définissez le tableau ci-dessus mess

    En outre, lorsque vous atteignez 10 éléments, vous redémarrez la lecture et écrasez les valeurs précédentes.


0 commentaires

8
votes

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: xxx

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


0 commentaires

2
votes

code d'entrée de tableau approprié xxx


1 commentaires

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.



-1
votes
.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:

2 commentaires

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 ? Votre programme fonctionnerait la même chose si vous avez supprimé cela et le j LisTloop juste avant. En outre, Déplacer $ T9, $ V0 ne stocke pas en mémoire, il suffit de copie un registre. On dirait que vous voulez SW .



0
votes

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 


3 commentaires

Commentaires comme Ajouter $ T8, $ T0, $ T8 #Ajouter $ T8 à $ T0, enregistrer à $ T8 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 commentaires comme addi $ t9, $ T9, -4 # adresse d'un [n-1] . En outre, certains de vos commentaires sous la partie où je suis arrivé à regarder, Swap: , ce sont faux. La $ T1, myarray ne charge pas a [1] , et ne charge même pas l'adresse de A [1 ] . C'est l'adresse de A [0] , identique à laquelle vous avez eu du la $ T4, myarray .


Vous faites le même la 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 . (Notez comment le commentaire explique la signification Semantic 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) au lieu d'utiliser un distinct (code> addiu pour compenser un enregistrement d'un pointeur. LW / SW 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.