也许您可以使用读取字符(代码 12)而不是读取整数(代码 5)
如果您确实读取字符,则需要将 ascii 转换为整数。所以这意味着需要一些操作。但它可以比我认为的其他方式更容易完成。
blackcompe 对读取字符提出了一个很好的观点。
我猜你必须读取字符串(代码 8),然后通过循环和检查 ascii 中的数字或 H 来验证用户输入。如果输入无效,则返回错误消息或其他内容。
这里还有一些从 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 = 数字 = 54
- 10 * 54 + 51 - 48 = 数字 = 543
这是基于上述内容的 MIPS 子程序。我知道这行得通,但我是 MIPS 初学者,所以请原谅任何愚蠢的错误。这再次假设一个有效的数字字符串。换句话说,另一个子程序将首先验证输入。
$a0 是以 null 结尾的字符串缓冲区的地址。旁边的注释是一个稍微修改的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 #