我正在汇编中编写一个程序,一次接受一个用户输入字符,并使用递归将其插入到按字母顺序排列的字符串中。我已经盯着这个很长一段时间了,但它似乎仍然应该有效。其他一些人将非常感激。
.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
具体来说,我收到了错误:
sw $t4, 0($t3)
它说:“商店中的未对齐地址:0x100100e7”
之后,我收到“异常5 [存储中的地址错误],并忽略”
后面跟着一个无休止的“异常6 [错误的指令地址]链”并且忽略了“
我正在使用QtSpim。
答案 0 :(得分:1)
您尝试使用word
(商店字)将sw
写入非字对齐的地址。 MIPS32上的word
长度为4个字节,并且必须在4的倍数的地址上对齐。
您可以将halfword
存储到半字对齐的位置(地址的2的倍数) )sh
(存储半字)和byte
到字节对齐的地址sb
(存储字节,毫不奇怪)。