2015-04-23 2 views
1

J'écris un programme en assembleur qui prend un caractère d'entrée utilisateur à la fois et l'insère dans une chaîne alphabétique en utilisant la récursivité. Cela fait longtemps que je regarde ça, mais il semble que ça devrait marcher. D'autres yeux sur ce sera grandement apprécié.Erreur "adresse non alignée en magasin" lors de l'enregistrement d'un mot

 .data 
text1: .asciiz "To begin, type a lower case letter.\n" 
text2: .asciiz "Any time you are prompted for an input, you may type a 'P' to print the alphabetized string.\n" 
text3: .asciiz "You can also type 'Q' to end the program.\n\n" 
text4: .asciiz "Input: " 
text5: .asciiz "End." 
err: .asciiz "Something broke\n" 
str: .asciiz "abcdefghijklmnopqrstuvwxyz" 
buffer: .space 30 
in:  .space 4 

     .text 
main: la $a0, text1    #opening statements 
     li $v0, 4 
     syscall 
     la $a0, text2 
     syscall 
     la $a0, text3 
     syscall 

input: la $a0, text4 
     li $v0, 4 
     syscall 
     li $v0, 12     #get input character 
     syscall 
     move $t0, $v0 
     li $a0, 0x0a    #print new line 
     li $v0, 11 
     syscall 

     beq $t0, 0x50, print  #input is 'P'; print out string 
     beq $t0, 0x51, end   #input is 'Q'; end 

     la $t1, str 
search: lb $t2, 0($t1)    #search for the starting location 
     beqz $t2, error 
     beq $t2, $t0, phase1 
     addi $t1, $t1, 1 
     j search 

phase1: sw $t2, ($sp)   #store the letter on the stack 
     sub $sp, $sp, 4  
     sw $t1, ($sp)   #store address of the letter on the stack 
     sub $sp, $sp, 4 
     addi $t1, $t1, 1  #increment address 
     lb $t2, 0($t1)   #getting next letter to prepare for next loop 
     beqz $t2, phase2  #if end of string is reached, come out of loop 
     jal phase1 
     j input 

phase2: lw $ra, ($sp)   #pull return location off stack 
     addi $sp, $sp, 4 
     lw $t3, ($sp)   #pull letter address off stack 
     addi $sp, $sp 4 
     lw $t4, ($sp)   #pull letter off stack 
     addi $sp, $sp, 4 
     addi $t3, $t3, 1  #increment old address to get new address 
     sw $t4, 0($t3)   #store the letter in its new location 
     jr $ra  

error: la $a0, err   
     li $v0, 4 
     syscall 
     j input 

print: la $a0, str 
     li $v0, 4 
     syscall 
     li $a0, 0x0a 
     li $v0, 11 
     syscall 
     j input 

end: la $a0, text5 
     li $v0, 4 
     syscall 
     li $v0, 10 
     syscall 

Plus précisément, je reçois des erreurs sur la ligne:

sw $t4, 0($t3) 

Il dit: "Adresse Unaligned en magasin: 0x100100e7"

Après cela, je reçois « Exception 5 [Erreur d'adresse en magasin] est survenu et a été ignoré "

suivi d'une chaîne sans fin de" Exception 6 [Mauvaise adresse d'instruction] survenue et ignorée "

J'utilise QtSpim.

Répondre

1

Vous essayez d'écrire un word à une adresse non-mot-aligné avec sw (mot de magasin). word s sur MIPS32 sont 4 octets de long, et doivent être alignés sur une adresse qui est un multiple de 4.
Vous pouvez stocker halfword s aux emplacements alignés en demi-mot (adresse multiple de 2) par sh (store halfword), et byte s aux adresses alignées par octets avec sb (octet de stockage, sans surprise).