需要MIPS程序的帮助吗

需要MIPS程序的帮助吗,mips,Mips,我正在开发一个将在pcspim上运行的mips程序,我需要一些帮助。该程序的描述是:编写一个程序,从键盘读取字符串,将其存储在内存中,并计算和打印每个字符的频率;然后它反转字符串并打印反转后的字符串 到目前为止,我已经 .data # Data declaration section userString: .space 256 Prompt: .asciiz "\nEnter a word: " newLine: .asciiz "\n" .text ma

我正在开发一个将在pcspim上运行的mips程序,我需要一些帮助。该程序的描述是:编写一个程序,从键盘读取字符串,将其存储在内存中,并计算和打印每个字符的频率;然后它反转字符串并打印反转后的字符串

到目前为止,我已经

    .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数组中。所以最后我试着打印出第一个字母。但它似乎没有打印任何东西

有什么建议吗?
谢谢。

我将您的代码分为三部分:提示、输入和显示。我想前两部分是给你的,第三部分是你现在关注的。我将解释第一到第三部分正在做什么,然后解释第三部分现在正在做什么,以及此时您可能希望它做什么

    .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
第一部分 这非常简单,当我们开始执行程序时,计数器将设置为
main
标签的地址。它将值
4
加载到
$v0
(这似乎是打印字符串系统调用号),然后将
提示符
字符串的地址加载到第一个参数寄存器
$a0
。最后一位只是执行将字符串放到屏幕上的系统调用

第二部分 既然
”输入一个单词:“
字符串已打印在屏幕上,我们希望实际读取用户正在键入的内容。看起来这里我们使用的是系统调用#8(可能是读取字符串),因此我们将该值加载到
$v0
中,为
系统调用做好准备。然后,由于我们希望将用户字符串读入
userString
,我们将该标签的地址加载到
$a0
(读取字符串函数的第一个参数)中,然后,由于我们是精明的程序员,我们给出了
$a1
userString
可以容纳(256)的字节数的上限。然后我们执行系统调用,在键盘上键入一个字符串,然后按enter键,我们返回到下一行代码

该行是jr$ra
,意思是“跳转到寄存器
$ra
(返回地址)中存储的位置”。您可能不希望出现这种情况,因为它标志着主函数的结束,您的程序可能会在此时退出到命令行,最好将其删除

第三部分 同样,您正在将
userString
的地址加载到
$a0
(并在下一行将其移动到
$t0
)。现在它变得奇怪了,您将
userString
的第一个字节
0($t0)
加载到
$t1
中。这是一个ASCII字符值(如72或其他)。然后用打印字符串system call(#4)和
$t1
的参数再次启动系统调用。你认为它会打印出单词的第一个字母,我不同意。原因如下。如果用户键入字符串“Hello,world!”,这就是它在内存中的样子:

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
的地址移动到register
$a0
,然后执行系统调用4,它应该将
userString
打印到屏幕上。

@mjshultz

我把它改了一点。我不认为我需要两个环。我还把它增加了四,因为我认为每个字符是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

我从未使用过PCSPIM,但它看起来像是
syscall
4打印字符串而不是字符。您可能需要尝试删除
lb
指令,并将整个字符串移动到
$a0
中。(它已经在那里了,但是你可以在那里做一个
move$a0,$t0
。我已经忘记了我对MIPS assembly所知甚少的事情,但是在前面的几行中,你用la$a0,Prompt显示了提示符处的内容。那么为什么你不通过:la$a0,userString来显示userString处的内容呢?为什么所有其他的指令,可能是,也可能不是正确吗?是的,我只是不确定如何将用户输入字符串存储到数组中。我在网上四处查看并试用了他们的一些代码。所以我不确定。我真的很讨厌mips.:(关于字符大小,每个字符都是1字节实体(使用
lb
或load byte指令),单词是4字节实体(并使用
lw
或load word指令)。至于为什么它只显示一个字母,您认为分支操作时,
$s0
中存储了什么值?它是
用户字符串的地址,对吗?您认为它是什么,是小于还是大于256?