首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要有关MIPS计划的帮助

需要有关MIPS计划的帮助
EN

Stack Overflow用户
提问于 2010-11-15 06:52:28
回答 2查看 11.7K关注 0票数 0

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

到目前为止我只有..。

代码语言:javascript
复制
    .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数组中。所以最后我试着把第一个字母打印出来。但它似乎没有打印任何东西。

有什么建议吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-11-15 08:17:27

我把你的代码分解成三个部分:提示,输入,显示。我假设前两部分已经给了你,第三部分是你现在关注的。我将解释第一部分正在做什么,然后解释第三部分现在正在做什么,以及你可能希望它在这一点上做什么。

代码语言:javascript
复制
    .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 (似乎是打印字符串系统调用编号),然后将Prompt字符串的地址加载到第一个参数寄存器$a0。最后一部分只是执行将字符串显示在屏幕上的系统调用。

第二部分

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

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

第三部分

同样,您将userString的地址加载到$a0中(并在下一行中将其移动到$t0中)。现在变得很奇怪了,你把userString的第一个字节0($t0)加载到$t1中。这是一个ASCII字符值(例如72或类似的值)。然后,使用打印字符串系统调用(#4)和$t1的参数再次启动系统调用。你认为它会打印单词的第一个字母,但我不同意。这就是为什么。如果用户输入字符串"Hello,world!“这是它在内存中的样子:

代码语言:javascript
复制
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输出到屏幕上。

票数 1
EN

Stack Overflow用户

发布于 2010-11-15 11:13:50

@mjshultz

我把它改了一点。我不认为我需要两个循环。另外,我将它递增了4,因为我认为每个字符都是4个字节,所以为了转到下一个字母,我需要将偏移量递增4。

代码语言:javascript
复制
        .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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4180170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档