У меня было много проблем с MIPS в последние недели, и оно ухудшилось от назначения более сложных проектов. для этого конкретного я создал связанный список, чтобы иметь процедуру / метод для вычисления длины строки и один для копирования его в кучу. мой код показан ниже.
.data
buff: .space 32
head: .word 0
nl: .asciiz "\n"
.text
main:
li $a1, 30
la $a0, buff
li $v0, 8
syscall
li $v0, 4
la $a0, buff
syscall
la $a0, buff
jal strlen
move $a0, $v0
li $v0, 1
syscall
la $a0, buff
jal strdup
no_print:
move $a0, $v0
li $v0, 4
syscall
li $v0, 10
syscall
#strlen:
# li $v0, 0
#loop:
#lb $t1, 0($a0) #load the next character to t0
# beqz $t1, exit #end loop if null character is reached
# addi $a0 $a0, 1 #load increment string pointer
# addi $v0, $v0, 1 #increment count
# j loop # return to top of loop
#exit:
# jr $ra
strlen:
move $v0,$a0 # remember base address
strlen_loop:
lb $t1, 0($a0) # get the current char
addi $a0,$a0,1 # pre-increment to next byte of string
bnez $t1,strlen_loop # is char 0? if no, loop
subu $v0,$a0,$v0 # get length + 1
subu $v0,$v0,1 # get length (compensate for pre-increment)
jr $ra
strdup:
#copys necessary elements to stack
addiu $sp, $sp, -8
sw $a0, 0($sp)
sw $ra, 8($sp)
jal strlen #compute the string's length
#Compute the amount of space needed to store the string onto heap
addiu $v0, $v0, 1
andi $a0, $v0, 0xfff9
li $v0, 9
syscall
lw $ra, 8($sp)
lw $a0, 0($sp)
addiu $sp, $sp, 8
#returns stack to normal
b strcpy.test
strcpy.loop:
sb $v0, 0($t0) # store byte in destination string
addi $t0, $t0, 1 # increment both addresses
addi $a0, $a0, 1
strcpy.test:
lbu $t0, 0($a0) # load a byte from source string
bnez $a0, strcpy.loop # stop when null is copied
strcpy.exit:
jr $ra
Когда я запускаю этот код, я получаю эти две ошибки
exception at PC = 0x004000bc
и
bad address in data/ stack at PC = 0x00000048
Я использую SPIM для компиляции BTW.
Не стесняйтесь звонить ниже с любыми полезными комментариями. все ценится, так как я действительно не знаю, куда идти отсюда.