# #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, если это необходимо), а также создать и заполнить область памяти этим макетом в вашей собственной программе, а затем передать ее адрес системному вызову. Да, это довольно утомительно. Есть причина, по которой были изобретены компиляторы!