Настройка VMIN и VTIME для сборки Termios

# #assembly #x86-64

Вопрос:

Я создаю игру в понг полностью в сборке x86_64 NASM. Мне удалось захватить ввод с клавиатуры с помощью Termios, однако при чтении stdin он ждет , пока не будет нажат символ. Это проблема, если я хочу, чтобы мяч двигался, не заботясь о вводе. Как заставить его подождать лишь небольшое количество времени, прежде чем перейти к остальной части кода? Я понял, что единственный способ сделать это-установить VTIME для части массива структуры Termios определенное значение и установить VMIN значение 0. Есть ли лучший способ? Если нет, то как бы вы это сделали? Я взял код, который я нашел здесь, об отключении канонического режима, и он работает, но я понятия не имею, как установить другие значения.

Комментарии:

1. Я думаю , что вы обычно делали бы это с select/poll помощью, а не с помощью специальных функций тайм-аута termios. Цель select и poll состоит в том, чтобы дождаться готовности ввода в файловый дескриптор или истечения заданного времени ожидания. Другой вариант-установить дескриптор файла в неблокирующий режим, чтобы, если данные недоступны, read он немедленно возвращался.

2. О, как вы устанавливаете файловый дескриптор в неблокирующий режим в сборке? Это кажется идеальным решением.

3. С. fcntl(fd, F_SETFL, O_NONBLOCK); Перевод системного вызова C в сборку-это упражнение, в котором вы, несомненно, уже много практиковались.

4. То же самое, прочитайте документацию для функции C и переведите ее в сборку.

5. Вы должны прочитать соответствующие системные заголовки, чтобы увидеть, как определены эти структуры, определить, как они расположены в памяти (со ссылкой на ABI, если это необходимо), а также создать и заполнить область памяти этим макетом в вашей собственной программе, а затем передать ее адрес системному вызову. Да, это довольно утомительно. Есть причина, по которой были изобретены компиляторы!