Нужна помощь с программой MIPS - PullRequest
0 голосов
/ 15 ноября 2010

Я работаю над программой mips, которая будет работать на pcspim, и мне нужна помощь.Описание программы: Напишите программу, которая читает строку (с клавиатуры), сохраняет ее в памяти, вычисляет и печатает частоту каждого символа;а затем он переворачивает строку и печатает перевернутую строку.

пока у меня есть ...

    .data   # Data declaration section
userString: .space 256
Prompt:     .asciiz "\nEnter a word: "
newLine:    .asciiz "\n"
    .text


main:       # Start of code section
li $v0, 4
la $a0, Prompt
syscall

li $v0, 8
la $a0, userString
li $a1, 256
    syscall
jr $ra

la $a0, userString
move $t0, $a0


lb $t1, 0($t0) 
li $v0, 4
move $a0, $t1
syscall     # prints first letter of word

Сейчас я просто хотел посмотреть, действительно ли я сохранил входные данные в массиве userString.В конце я попытался распечатать первую букву.но, кажется, ничего не печатает.

Есть предложения?спасибо.

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Я разбил ваш код на три части: подсказки, ввод, отображение. Я предполагаю, что первые две части были даны вам, а третья - это то, на чем вы сейчас сосредоточены. Я объясню, что делают первые части, затем объясню, что третья делает прямо сейчас, и что вы, вероятно, хотите, чтобы она делала в этот момент.

    .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.

0 голосов
/ 15 ноября 2010

@ mjshultz

Я немного изменил это. Не думаю, что мне нужно 2 петли. Также я увеличил его на четыре, потому что я думал, что каждый символ составляет 4 байта, поэтому для перехода к следующей букве мне нужно увеличить смещение на четыре.

        .data   # Data declaration section
userString: .space 256
Prompt:     .asciiz "\nEnter a word: "
newSpace:   .asciiz " " 
newLine:    .asciiz "\n"

    .text


main:       # Start of code section
li $v0, 4
la $a0, Prompt
syscall


la $a0, userString
li $a1, 256
li $v0, 8
    syscall

la $a0, userString
move $s0, $a0

loop:   
lb $t1, 0($s0)
li $v0, 1
move $a0, $t1
syscall 

li $v0, 4
la $a0, newSpace
syscall 
addi $s0, $s0, 4

blt $s0, 256, loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...