也许你可以使用读取字符(代码12),而不是读整数(代码5)
如果你读的性格,你需要从ASCII到整数转换。所以这意味着需要一些操作。但它可以做得比我想的其他方式更容易。
blackcompe对阅读字符做了一个好点。
我想你将不得不做读取字符串(代码8),然后通过循环和检查数字或H ascii验证用户输入。然后返回一条错误消息或其他东西,如果输入无效。
此处还有一些伪代码可以将ascii字符串转换为数字。这假定有一串有效的数字。当然,你只有两位数字,所以这可能是不必要的,但应该工作。
number = 0
for(i = 0; i < str.length; i++)
number = 10 * number + ascii(str[i]) - ascii('0');
我同意blackcompe的回答要好得多。但我只想表明转换循环实际上起作用。我想迭代,这只是将ASCII数字字符串转换为数字。它不检查H并假定该数字可以是任意长度的。另外,您仍然需要对MIPS中的工作进行调整。
下面是一个示例,显示我的转换循环实际工作。这里是用python重写的例子,所以它可以被测试。当然,这在python中是没有意义的。
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:
pointlesslyConvertStringToNumber("543")
这里是一步一步循环的:
- 10 * 0 + 53 - 48 =数= 5
- 10 * 5 + 52-48 = number = 54
- 10 * 54 + 51-48 = number = 543
这里是基于上述的MIPS子程序。我知道这是有效的,但我是MIPS初学者,所以请原谅任何愚蠢的错误。这又是一个有效的数字字符串。换句话说,另一个子程序会首先验证输入。
$ a0是空终止的字符串缓冲区的地址。 在侧面的评论是一个稍微修改后的python函数,以更好地适应MIPS代码。但它不完全是一对一的。从键盘输入到内存时
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 #
如果你正在解析ascii并将其转化为数字(而且,实际上,我不明白你是怎么做的,否则,除非这是一个巨大的设计错误),那么你需要检查'H '*之前* ascii - >整数转换。更多的代码不会受到伤害。 – tbert 2012-04-22 06:17:40
如果我在读取整数之前检查'H',它会每次都等待输入'H'来继续游戏。 – Husam89 2012-04-22 06:51:45