logo
несколько программ / bsp33

Программирование сопроцессора

Используя языки высокого уровня, такие как Си или Паскаль, вы можете даже и не знать, что созданная вами программа применяет для вычислений арифметический сопроцессор. В проекте программы вам обычно предоставляется возможность выброа одного из трех вариантов стандартной библиотеки:

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

Все что вам нужно для работы с библиотекой эмуляции - просто выбрать ее при установке системы программирования. Это самый простой способ программирования сопроцессора, когда вам, вообще говоря, совсем не надо его программировать - всю работу по использоанию сопроцессора выполнят модули библиотеки эмуляции.

Второй вариант библиотеки рассчитан на наличие сопроцессора. Если сопроцессора нет, программа работать не будет. Но если известно, что сопроцессор есть (например, процессор Pentium всегда содержит блок арифметики), то имеет смысл использовать именно этот вариант как самый быстродействующий.

Третий вариант не использует сопроцессор совсем. Все вычисления выполняются специальными подпрограммами, входящими в состав библиотеки альтернативной математики и подключающимися к вашей программе автоматически на этапе редактирования.

К сожалению, есть программы, в которых использование библиотеки эмуляции невозможно или крайне затруднительно:

В случае с резидентными программами невозможность использования библиотеки эмулятора вызвана тем, что после оставления программы резидентной в памяти, например, функцией _dos_keep, она теряет доступ к модулям эмуляции.

Механизм вызова программ эмуляции основан на использовании прерываний с номерами 34h - 3Eh. Перед тем как оставить программу резидентной, функция _dos_keep восстанавливает содержимое указанных векторов прерываний, делая невозможным доступ резидентной программе к модулям эмулятора. Да и самих этих модулей уже нет в памяти - на их место может быть загружена новая программа.

Поэтому в руководстве по языку программирования Си рекомендуется для резидентных программ применять библиотеку альтернативной математики. Но эта библиотека, увы, не использует сопроцессор.

Ситуация с драйверами аналогична - драйверы, как правило, составляются на языке ассемблера, поэтому средства эмуляции библиотек Си недоступны.

Выходом может быть непосредственное программирование сопроцессора на языке ассемблера. При этом вы можете полностью использовать все возможности сопроцессора и добиться от программы наибольшей эффективности вычислений.

Какие средства можно использовать для составления программ для сопроцессора?

Обычно это или ассемблер MASM (возможно использование TASM), либо интегрированная среда разработки, содержащая встроенный ассемблер.