Как я могу убедиться, что в коде C нет арифметики с плавающей запятой (Visual Studio 2013 express + WDK 8.1, драйвер ядра WDM)? - PullRequest
1 голос
/ 22 октября 2019

Несколько лет назад я столкнулся с модифицированным драйвером moufiltr (производства Povohat), который позволяет пользователю настраивать ускорение мыши. Этот драйвер использовал арифметику с плавающей точкой. Я нашел образец драйвера mouclass в примерах WDK7, основанный на драйвере povohat's moufiltr. Я изменил этот образец, чтобы включить настраиваемое ускорение (уравнение из Quake 3 cl_input.c), но с увеличенными целыми числами вместо двойных и т. Д. Без необходимости KeSaveFloatingPointState. Смысл этого в том, чтобы иметь что-то и для Windows XP.

Можно ли предположить, что арифметика с плавающей запятой не используется, если в расчетах используются только переменные типа LONGLONG (+, /, *,%)?

1 Ответ

0 голосов
/ 23 октября 2019

Даже если ваш код не содержит литералов с плавающей запятой, переменных с плавающей запятой и приведений с плавающей запятой, небезопасно предполагать, что в нем нет операций с плавающей запятой на уровне скомпилированного машинного кода. Обычно при отключенных оптимизациях скомпилированный код - это, по сути, прямая трансляция исходного кода, в этом случае ваши шансы выше, чем если у вас нет механики с плавающей запятой в исходном коде, то и вы не будете в скомпилированном коде. Однако компиляторы обычно имеют полный доступ к набору команд целевой архитектуры, и при включенных оптимизациях они сильно изменят окончательный скомпилированный вывод в соответствии с критериями оптимизации (обычно это скорость и / или размер). В этом случае, если некоторые (или все) инструкции с плавающей запятой сочтены компилятором необходимыми, они будут присутствовать в скомпилированном машинном коде, даже если ваш исходный код не содержит их. Если ваш компилятор не поддерживает ограничение того, какие инструкции машинного кода (ассемблера) он может использовать, а VS 2013 Express этого не делает, то единственный способ выяснить это - декомпилировать ваш скомпилированный код и самостоятельно искать инструкции с плавающей запятой.

...