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