読み取り整数 (コード 5) の代わりに読み取り文字 (コード 12) を使用できるかもしれません。
文字を読み取る場合は、ASCII から整数に変換する必要があります。つまり、何らかの操作が必要になります。しかし、それは私が考える逆の方法よりも簡単に行うことができます.
blackcompe は、読み取り文字について良い点を指摘しました。
文字列の読み取り (コード 8) を実行してから、ループして数字または ascii の H をチェックして、ユーザー入力を検証する必要があると思います。入力が無効な場合は、エラー メッセージまたは何かを返します。
また、ASCII文字列から数値に変換する擬似コードもいくつかあります。これは、数字の有効な文字列を前提としています。確かに 2 桁の数字しかないので、これは不要かもしれませんが、機能するはずです。
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 で終了する文字列バッファーのアドレスです。横のコメントは、MIPS コードにより適合するように少し変更された Python 関数です。しかし、厳密には 1 対 1 ではありません。
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 #