首页
学习
活动
专区
圈层
工具
发布

MIPS铸造
EN

Stack Overflow用户
提问于 2012-04-22 06:05:20
回答 2查看 2.5K关注 0票数 2

我有个有趣的问题!

我在MIPS中实现了一个记忆游戏,游戏首先在屏幕上随机打印一个介于10-99之间的数字,然后让用户输入确切的数字。如果用户输入正确的数字,游戏将继续显示第一个数字和一个在10-99之间随机生成的第二个数字。这两个数字必须一个接一个地显示,在它们之间有3秒的延迟。然后要求用户按正确的顺序输入屏幕上出现的数字。如果用户正确地输入了这两个数字,游戏将继续使用三个数字,然后是四个等等。

这是比赛的一个快速的夏天,但事情是这样的。

我想添加一个辅助选项,如果用户输入字母'H‘,程序会给他一个提示。

我用这个从接受数字的用户那里获得输入。

李嘉诚(

li $v0,5 )

赛瑟尔

这个“读取整数”,但一旦用户输入“H”,就会出现运行时错误,

我认为'H‘的值在ASCII中是: 72,我把它作为用户使用的数字作为提示,但不幸的是,程序可能会生成一个随机数'72’,当用户输入它时,它给了他一个提示,而他不想要提示,他只是想继续游戏。

问题是:

我正在寻找的是一种方法或任何技巧来做这样的一个高水平的语言。到目前为止,我还没有找到解决这个问题的办法。

是否有任何方法来清除MIPS中的屏幕或控制台?因为很明显这是在背诵游戏!所以数字应该会消失!

任何有关这方面的建议或问题,都是完全欢迎!

EN

回答 2

Stack Overflow用户

发布于 2012-04-22 07:34:10

当从键盘输入到内存时,所有字符都可以表示为ascii,但是read_int syscall将尝试从该ascii解析一个整数,对于非数字字符,它将失败。

唯一的选择是使用字符串。创建缓冲区

代码语言:javascript
复制
buf: .byte 0,0,0      #10-99, last byte is for null

用于用户输入。读取字符串后,检查缓冲区中的第一个字符是否为'H‘。

代码语言:javascript
复制
la $t1, buf
lb $t2, 0($t1)
li $t3, 72
beq $t2, $t3, help

如果没有'H',那么继续从字符串中解析一个整数。

代码语言:javascript
复制
i = buf.length-2;
j = 1;
k = 0;
while(i >= 0) {    //go in reverse
    if(buf[i] != NULL) {
        k += (buf[i] - 48) * j
        j *= 10;
    }
    i--;
}
if(k == target)print("success");

不要忘记每次提示时清除缓冲区。

票数 3
EN

Stack Overflow用户

发布于 2012-04-22 06:49:52

也许你可以用读字符(代码12)代替读整数(代码5)。

如果确实读取字符,则需要从ascii转换为整数。因此,这意味着需要进行一些操作。但这比我想的要容易得多。

布莱克本对读字有很好的见解。

我猜您必须读取字符串(代码8),然后通过循环和检查ascii中的数字或H来验证用户输入。然后,如果输入无效,则返回错误消息或其他内容。

这里还有一些伪代码,可以从ascii字符串转换为数字。这假设一个有效的数字字符串。当然,您只有两个数字,所以这可能是不必要的,但应该可以工作。

代码语言:javascript
复制
number = 0
for(i = 0; i < str.length; i++)
    number = 10 * number + ascii(str[i]) - ascii('0');

我同意blackcompe的回答要好得多。但我只想证明转换循环确实有效。我想要迭代,这只是将一个ascii字符串的数字转换成一个数字。它不检查H,并假定这个数字可以是任意长度。此外,您还需要在MIPS中对其进行调整。

下面是一个示例,说明我的转换循环实际工作。下面是用python重写的示例,因此可以进行测试。当然,在python中这样做是毫无意义的。

代码语言:javascript
复制
def pointlesslyConvertStringToNumber(str):
    number = 0
    for c in str:
        //Note: ord is a function to convert a character to ascii
        number = 10 * number + ord(c) - ord('0')
    print number 

让我们使用数字543:

代码语言:javascript
复制
pointlesslyConvertStringToNumber("543")

下面是循环的一步一步的步骤:

  1. 10 *0+53-48= number = 5
  2. 10 *5+52-48= number = 54
  3. 10 * 54 +51-48= number = 543

下面是基于以上内容的MIPS子程序。我知道这是可行的,但我是MIPS初学者,所以请原谅任何愚蠢的错误。同样,这假设了一个有效的数字字符串。换句话说,另一个子例程将首先验证输入。

$a0是以空结尾的字符串缓冲区的地址.旁边的注释是一个稍微修改过的python函数,以更好地适应MIPS代码。但这并不完全是一对一的。

代码语言:javascript
复制
getNumber:                                  # def getNumber(input):
    addi  $sp, $sp, -8                      #
    sw    $ra, 4($sp)                       #
    sw    $a0, 0($sp)                       #
    add   $t0, $a0, $zero                   #
    add   $t1, $zero, $zero                 # i = 0
    addi  $t4, $zero, 10                    #
gnLoop:                                     # while(input[i] != None):
    lb    $t2, 0($t0)                       #
    beq   $t2, $zero, gnEnd                 # 
    mult  $t1, $t4                          # number = 10 * number
    mflo  $t1                               # 
    addi  $t3, $t2, -48                     # 
    add   $t1, $t1, $t3                     # number += ord(input[i]) - ord('0')
    addi  $t0, $t0, 1                       # i +=1
    j     gnLoop                            #
gnEnd:                                      # 
    lw    $a0, 0($sp)                       #
    lw    $ra, 4($sp)                       #
    addi  $sp, $sp, 8                       # 
    add   $v0, $zero, $t1                   # return number  
    jr    $ra                               #
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10265639

复制
相关文章

相似问题

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