Как сохранить строку ввода от пользователя и завершить после второй строки вернуть '\ n' '\ n' - PullRequest
1 голос
/ 14 марта 2020

Добрый день,

Я пытаюсь записать пользовательский ввод через системный сервисный номер 8 на MARS_4.5.

Ввод является строкой, и он должен принимать новую строку '\ п. Проблема в том, что системный вызов 8 перестанет читать на новой строке, как fgets () на UNIX.

. Единственное решение, которое я сейчас имею в виду, - это go путем записи файла и последующего чтения. чтобы потом манипулировать моей строкой.

Я хотел бы знать, есть ли более очевидный способ сделать это.

Спасибо за ваши предложения,

Карл

//prompt
la   $a0, prompt_msg  
li   $v0, 4    
syscall

//save input in buffer
la   $a0, buffer
li   $a1, 300      
li   $v0, 8         
syscall

//display input
la $a0, input_display
li $v0, 4
syscall
la $a0, buffer
syscall

1 Ответ

2 голосов
/ 14 марта 2020

MARS имеет системный вызов read-file , который может читать из стандартного ввода (fd = 0), как POSIX read(fd, buf, max_len). $ v0 = 14 / syscall.

Это может прочитать более двух новых строк, но ваш код, который анализирует ввод, может прекратить зацикливание, где вы хотите.

Или вы можете просто использовать строку чтения Системный вызов fgets ($v0=8) до тех пор, пока пользователь не нажмет клавишу возврата, возвращает пустую строку, в результате чего первый байт ввода будет '\n'.


Кроме этого; Я не думаю, что ограниченный API syscall для игрушек, предоставляемый MARS, может запрашивать, доступен ли символ, поэтому ваш выбор блокируется до тех пор, пока пользователь не нажмет вторую новую строку, или не оставит его непрочитанным.

В действительности Операционные системы, обычно есть способ сделать неблокирующий запрос, чтобы выяснить, ожидает ли какой-либо ввод для чтения. (Например, POSIX select() или fcntl для установки дескриптора файла на O_NONBLOCK, поэтому при чтении будет установлен errno=EAGAIN без блокировки, если нет готовых вводимых данных, и необработанный или готовый TTY, позволяющий читать символы до возвращения пользователя). Но системные вызовы MARS / SPIM подходят только для программ, которые не имеют сложных пользовательских интерфейсов.

...