Проверка целочисленного ввода пользователя в сборке MIPS - PullRequest
0 голосов
/ 23 марта 2020

У меня есть задание, которое требует от меня создания калькулятора c, который может выполнять четыре операции c (сложение, вычитание, умножение, деление) над целыми числами в сборке MIPS. Часть назначения требует проверки пользовательского ввода, чтобы убедиться, что пользователь вводит как целое число, так и правильный операнд. У меня есть калькулятор basi c и проверка ввода операндов. Мне интересно, какой лучший или хороший способ выполнить sh проверку целочисленного ввода будет.

В настоящее время я использую системный вызов для чтения целых чисел. Когда пользователь вводит что-либо кроме целого числа, ноль сохраняется в регистре $ v0 (регистр возврата для функции syscall). Сначала я просто использовал команду ветвления, если она равна нулю, для перехода к подпрограмме, которая просит пользователя ввести действительное целое число и возвращается к подпрограмме, которая читает и сохраняет целое число. Единственная проблема в том, что пользователь не может ввести 0, которое является допустимым целым числом.

Как я могу go сделать это? Должен ли я считать входные данные в виде строки вместо целого числа, а затем проанализировать строку, чтобы убедиться, что значение ASCII каждого символа соответствует целому значению ASCII? Пожалуйста, дайте мне знать, если требуется дополнительная информация. Я не могу опубликовать код, потому что это активное задание в моем классе.

1 Ответ

0 голосов
/ 23 марта 2020

Учитывая ограниченный набор игрушек "системных вызовов" MARS / SPIM , да, если вы хотите проверить ввод, вам нужно прочитать строку и разобрать ее в целое число самостоятельно. (total = total*10 + (c - '0') для базы 10)

К сожалению, нет другого возвращаемого значения, которое бы указывало на успешное преобразование или не совпадало бы с C strtol. Они могли бы сконструировать вызовы чтения номера для возврата 0 или 1 в $v1, чтобы указать сбой / успех, но они этого не сделали.

По какой-то безумной причине системный вызов read-string ($v0=8) очевидно не возвращает количество прочитанных байтов. Он сохраняет только терминатор 0 в конце ввода в буфере. Так что вы не можете просто вычислить конечный указатель для al oop. Но, тем не менее, вы можете однозначно определить количество прочитанных байтов. Итак, это ваша отправная точка для того, чтобы знать, на какие байты смотреть в первую очередь.

MARS позволяет вам read() (v0 = 14) вместо fgets() от стандартного ввода, что будет возвращать количество байтов.

...