MIPS: сохранить ввод строки в память - PullRequest
0 голосов
/ 09 июня 2018

Вот минимальный рабочий пример для программы 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.Я полагаю, что ошибка связана с распределением памяти, хотя я точно не знаю, в чем конкретно заключается проблема.Любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 09 июня 2018

По предложению Майкла , команда в строке 18 неверна.Вместо sw $v0, 0($s3) вместо него следует читать sw $a0, 0($s3).В предоставленном коде произошла ошибка.

...