Вот минимальный рабочий пример для программы MIPS, которая запрашивает ввод строки и затем распечатывает ее:
.data
enterString: .asciiz "Please enter a string: "
theString1: .asciiz "The string is"
buffer: .space 100
.text
# Allocate memory for an array of strings
addi $v0, $zero, 9 # Syscall 9: Allocate memory
addi $a0, $zero, 4 # number of bytes = 4 (one word)
syscall # Allocate memeory
add $s1, $zero, $v0 # $s1 is the address of the array of strings
add $s3, $zero, $s1 # $s3 is the temporary address of the array of strings
#Ask user for input
add $v0, $zero, 4 # Syscall 4: Print string
la $a0, enterString # Set the string to print to enterString
syscall # Print "Please enter..."
jal _readString # Call _readString function
#Store it in memory
sw $v0, 0($s3) # Store the address of a string into the array of strings
add $s3, $zero, $s1 # $s3 is the temporary address of the array of strings
addi $v0, $zero, 4 # Syscall 4: Print string
la $a0, theString1 # Set the string to print to theString1
syscall # Print "The string..."
lw $a0, 0($s3) # Set the address by loading the address from the array of string
syscall # Print the string
j done
#Readstring: read the string, store it in memory. NOT ALLOWED TO CHANGE ANY OF THE ABOVE!!!!!!!!!
_readString:
addi $v0, $zero, 8 #Syscall 8: Read string
la $a0, buffer #load byte space into address
addi $a1, $zero, 20 # allot the byte space for string
syscall
jr $ra
done:
Я получаю сообщение об ошибке, а именно Error in line 24: Runtime exception at 0x00400044: address out of range 0x00000008
.(Строка 24, для справки, является окончательной syscall
перед методом readString
.) Мне не разрешено изменять код выше _readString:
;другими словами, я только для того, чтобы написать и реализовать код для функции _readString
.Я полагаю, что ошибка связана с распределением памяти, хотя я точно не знаю, в чем конкретно заключается проблема.Любая помощь приветствуется.Спасибо.