Код, как сейчас, использует сервис read_int (код системного вызова 5), вызывая его с помощью
li $v0, 5 #read int from user
syscall
Теперь, если вам нужно прочитать символы ASCII, вы должны использовать сервис read_string ( код системного вызова 8), который будет хранить буфер чтения в $a0
и его длину в $a1
.
li $v0, 8 # Note the only change is 8 instead of 5
syscall
Теперь для сравнения входного номера с номером в коде у вас есть два варианта :
- Напишите свой код так, чтобы набор сгенерированных чисел был в формате ASCII, и сравните два значения ASCII.
- Преобразование вводимого пользователем символа ASCII в десятичное и сравнение чисел.
Для первого вам нужно разделить число на цифры, добавить к ним 48 и объединить результаты в строку.
Для второго решения вам нужно выполнить итерацию буфер и вычесть 48 для каждого символа ASCII.
Это алгоритм для преобразования массива ASCII в целое число, но для его работы предполагается, что вы сохранили буфер в $s1
, $t0
содержит 10
, а $s2
содержит 0
:
lp:
lbu $t1, ($s1) #load unsigned char from array into t1
beq $t1, $0, FIN #NULL terminator found
blt $t1, 48, error #check if char is not a digit (ascii<'0')
bgt $t1, 57, error #check if char is not a digit (ascii>'9')
addi $t1, $t1, -48 #converts t1's ascii value to dec value
mul $s2, $s2, $t0 #sum *= 10
add $s2, $s2, $t1 #sum += array[s1]-'0'
addi $s1, $s1, 1 #increment array address
j lp #jump to start of loop