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.