Страница 54 из 56
/* Восстановить установки управляющего порта */
outportb(0x61, originalbits);
}
Далее необходимо написать функцию, которая установит ваш об-
- 443,444 -
работчик прерывания. Вы передадите ей адрес написанной ранее
функции и соответствующий номер прерывания (0 ...255 или 0х00...0
хFF). Эта функция должна выполнить 3 действия:
- запретить прерывания, чтобы во время модернизации вектор-
ной таблицы не произошло ничего непредвиденного;
- сохранить переданный адрес в соответствующем месте;
- разрешить прерывания, чтобы все снова правильно работало.
Ваша подпрограмма настройки будет выглядеть так:
void install(void interrupt (*faddr)(), int inum)
{
setvect(inum, faddr);
}
Наконец, вам понадобится вызвать подпрограмму звукового сиг-
нала для того, чтобы подвергнуть ее проверке. Это сделает такая
функция:
void testbeep(unsigned char bcount, int inum)
{
_AH = bcount;
geninterrupt(inum);
}
Теперь ваша функция main имеет следующий вид:
main()
{
char ch;
install(mybeep, 10);
testbeep(3, 10);
ch = getch();
}
- 445,446 -
Использование библиотек программ для работы с плавающей точкой
-----------------------------------------------------------------
В Си вы работаете с двумя типами чисел: целыми (int, short,
long и т.п.) и с плавающей точкой (float, double). Установленный
в вашей машине процессор легко работает с целыми значениями, а
для работы с плавающей точкой он затрачивает больше времени и ре-
сурсов.
Однако, семейство процессоров iAPx86 имеет соответствующее
семейство математических сопроцессоров 8087 и 80287. 8087 и 80287
(и тот и другой мы называем здесь сопроцессорами) - это специаль-
ные арифметические процессоры, которые могут быть установлены в
ваш РС. Они выполняют команды с плавающей точкой очень быстро.
Если вы работаете с величинами, в которых часто встречается пла-
вающая точка, то вам непременно захочется работать с сопроцессо-
ром. Центральный процессор в вашем РС взаимодействует с
8087/80287 посредством специальных прерываний.
Турбо Си поможет гибко использовать программы непосредствен-
но для вашего РС и ваших нужд.
- Если вы не будете использовать значения с плавающей точ-
кой, сообщите об этом заранее компилятору.
- Если вам нужно использовать значения с плавающей точкой,
но ваш РС не имеет арифметического сопроцессора (8087/80287), то
сообщите Турбо Си, что выполнять компоновку в специальных подп-
рограммах можно так же, как если бы у вас был сопроцессор. В том
случае, если ваша программа работает в машине с сопроцессором, он
будет использоваться автоматически, и программа будет выполняться
очень быстро.
- Если вы пишите программы для систем, которые имеют арифме-
тический сопроцессор, то можете предписать компилятору Турбо Си
использовать программу, которая всегда работает с сопроцессором
8087/80287.
В следующих примерах для ТСС и TLINK предполагается, что
файл TURBOC.CFG существует с корректной установкой маршрутов -L и
-I и что библиотека и начальные объектные файлы сохранены в под-
каталоге, именуемом LIB.
- 447,448 -
Эмуляция микросхемы 8087/80287
-----------------------------------------------------------------
Предположим, что вы хотите использовать величины с плавающей
точкой или вы имеете программу, использующую величины с плавающей
точкой, но ваш компьютер не имеет арифметического сопроцессора,
то будет ли выполняться ваша программа? Успокойтесь, Турбо Си по-
может в этой ситуации.
В соответствии с опцией эмуляции компилятор будет генериро-
вать программу так, как если бы 8087/80287 в РС был, но программа
будет выполнять компоновку в библиотеке эмуляции (EMU.LIB). При
выполнении программа будет использовать 8087/80287, если он есть;
в противном случае программа будет использовать специальное прог-
раммное обеспечение для 8087/80287 - эмулятор.
Библиотека эмуляции работает так:
- когда ваша программа начинает выполняться, то начальная
Си-программа определяет, есть ли 8087/80287 или нет;
- если сопроцессор есть, то программа при помощи специальных
прерываний для 8087/80287 разрешит использование микросхемы
8087/80287 для программы пользователя.
- если сопроцессора нет, то программа останавливает прерыва-
ния и переходит к эмуляционным подпрограммам.
Пусть вы модифицировали RATIO.C таким образом:
main()
{
float a,b,ratio;
printf(" Введите два значения: ");
scanf("%f %f",%a,%b);
ratio = a/b;
printf("Результат деления будет %0.2f\n",ratio);
}
Если вы используете ТС (версию пользовательского интерфей-
са), то нужно выйти в меню Options, выбрать Compiler, выбрать
Code generation и затем выбирать элемент Floating-point до тех
- 449,450 -
пор, пока на следующем поле не прочтете Emulation. Когда вы ком-
пилируете и компонуете свою программу, Турбо Си автоматически вы-
бирает для нее соответствующие опции и библиотеки.
Если вы используете ТСС (автономный компилятор), то команд-
ная строка будет выглядеть следующим образом:
tcc -mX ratio
Если вы выполняете компоновку результирующей программы с ко-
мандной строки, то должны точно определить как соответствующую
математическую библиотеку (зависящую от размера модели), так и
файл EMU.LIB. Опция эмуляции (-f) устанавливается по умолчанию,
так что не нужно задавать ее, если ваш файл TURBOC.CFG не включа-
ет один из переключателей плавающей точки (-f- или -f87).
Вызов TLINK будет выглядеть так:
tlink lib\c0X ratio, ratio, ratio, lib\emu.lib lib\mathX.lib
lib\cX.lib
где X - буква, обозначающая соответствующую модель библиотеки.
Замечание: команда tlink записывается на одной строке.
Также помните, что порядок библиотек очень важен.
- 451,452 -