Я разбил ваш код на три части: подсказки, ввод, отображение. Я предполагаю, что первые две части были даны вам, а третья - это то, на чем вы сейчас сосредоточены. Я объясню, что делают первые части, затем объясню, что третья делает прямо сейчас, и что вы, вероятно, хотите, чтобы она делала в этот момент.
.data # Data declaration section
userString: .space 256
Prompt: .asciiz "\nEnter a word: "
newLine: .asciiz "\n"
.text
# Part I
main: # Start of code section
li $v0, 4
la $a0, Prompt
syscall
# Part II
li $v0, 8
la $a0, userString
li $a1, 256
syscall
jr $ra
# Part III
la $a0, userString
move $t0, $a0
lb $t1, 0($t0)
li $v0, 4
move $a0, $t1
syscall # prints first letter of word
Часть I
Это довольно просто, когда мы начнем выполнение, счетчик программы будет установлен на адрес метки main
. Он загружает значение 4
в $v0
(который выглядит как номер системного вызова строки печати), а затем загружает адрес строки Prompt
в регистр первого аргумента $a0
. Последний бит просто выполняет системный вызов, который выводит строку на экран.
Часть II
Теперь, когда на экране напечатана строка "Enter a word: "
, мы хотим на самом деле прочитать, что печатает пользователь. Похоже, что здесь мы используем системный вызов # 8 (возможно, чтение строки), поэтому мы загружаем это значение в $v0
при подготовке к syscall
. Затем, поскольку мы хотим прочитать пользовательскую строку в userString
, мы загружаем адрес этой метки в $a0
(первый аргумент для функции чтения строки), затем, поскольку мы опытные программисты, мы даем верхнюю границу сколько байтов userString
может содержать (256) в $a1
. Затем мы выполняем системный вызов, вы вводите строку на клавиатуре и нажимаете ввод, и мы возвращаемся к следующей строке кода.
Эта строка jr $ra
, что означает «перейти к месту, сохраненному в регистре $ra
(обратный адрес)». Вы, вероятно, не хотите этого, потому что это отмечает конец основной функции и, вероятно, ваша программа завершает работу обратно в командную строку в этот момент, вероятно, лучше всего удалить ее.
Часть III
Опять же, вы загружаете адрес userString
в $a0
(а также перемещаете его в $t0
в следующей строке). Теперь это становится странным, вы загружаете первый байт 0($t0)
из userString
в $t1
. Это символьное значение ASCII (например, 72 или что-то). Затем вы снова запускаете системный вызов с системным вызовом print string (# 4) и аргументом $t1
. Как вы думаете, напечатает первую букву слова, с которым я не согласен. Вот почему Если пользователь вводит строку, «Привет, мир!» вот как это выглядит в памяти:
userString: H e l l o , w o r l d !
offset: 0 1 2 3 4 5 6 7 8 9 10 11 12
Итак, загрузка 0($t0)
перемещает букву H
в регистр $t1
, затем при выполнении системного вызова она пытается вывести строку, начинающуюся с H
, на экран. Однако нет строки, начинающейся с буквы H
, она начинается с адреса userString
. Так что, если вы просто переместите адрес userString
в регистр $a0
, то при системном вызове # 4 на экране должно появиться userString
.