- •Программирование блока fpu в ia-32. Регистры блока обработки чисел с плавающей точкой
- •Базовые команды математического сопроцессора
- •Административные команды
- •Циклы и ветвления при работе с сопроцессором
- •InCcntr; Инкремент счетчика
- •Программирование сопроцессора с использованием операций вычисления частичных математических функций
Административные команды
Экспериментировать с простейшими действиями сопроцессора можно опираясь на факт его начального сброса при загрузке системы, но для построения системных управляющих программ необходимо владеть комплексом административных команд для гибкого и полного управления сопроцессором.
Перед началом работы с математическим сопроцессором ix87 должна быть выполнена инициализация сопроцессора. Программы установки среды выполняют ее в числе других начальных установок. Если такие программы не выполняются, то программист может задать начальные установки следующей последовательностью команд:
FINIT ; Начальный сброс сопроцессора
FLDCWслово с начальном состоянием регистра CW
Кроме начальных установок программист должен позаботиться об обработке прерываний и переполнений стека сопроцессора, что может возникать при вложенных обращениях к процедурам, использующим сопроцессор. К этим командам относятся:
FSTCW слово-приемник регистра управления
FLDCW слово-источник: регистра управления
FSTSW слово-приемник регистра состояния
FLDSW слово-источник регистра состояния
FSTENV блок-приемник состояния среды сопроцессора
FLDENV блок-источник состояния среди сопроцессора
FSAVE блок-приемник состояния среды и регистров сопроцессора
FRSTOR блок-источник состояния среди и регистров сопроцессора
FCLEX ; Сброс флагов особых случаев
Размер блоков сохранения должен обеспечить сохранение и последующее восстановление как всех программно доступных регистров сопроцессора, так и внутренних регистров сопроцессора, недоступных по другим командам:
регистр управления CW (смещение 0для 16- и 32-битовых режимов);
регистр состояния SW (смещение 2для 16- и4– для 32-битовых режимов);
слово тэгов, в котором каждая пара битов отображает текущее состояние физического регистра с плавающей точкой (смещение 4/8);
указатель команды IP(6/0Ch);
селектор CSи/или код операции (8/10h);
смещение операнда IP(0ah/14h);
селектор операнда (0Ch/18h).
Таким образом, для 16-битового режима полный размер области сохранения составляет 94 байта, а 32-битового - 108 байтов. Отметим, что пустые регистры в стеке сопроцессора могут возникать после выполнения команд декремента стека сопроцессора FDECSTPи освобождения регистровFFREE st[i].
Для составления связующих элементов программ и контроля за взаимодействием сопроцессора с центральным процессором целесообразно использовать элементарные команды математического сопроцессора, включенные в язык Ассемблера. Основу взаимодействия составляет использование центральным процессором и сопроцессором общей последовательности команд. В принципе для управления математическим сопроцессором и взаимодействия с центральным процессором используются команды центрального процессора ESCиWAIT. Единственная команда, подключающая сопроцессор к работе имеет мнемоникуESCпредставляется во внутримашинном двоичном формате:
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
смещение данных |
1 |
1 |
0 |
1 |
1 |
ccc |
mod |
ccc |
r/m |
(d8/d16) |
Структура кода FPU-инструкции
Здесь буквами ссс обозначены биты кода операции сопроцессора, mod –модификация операндов,r/m –регистр или указатель типа операнда в памяти. В машинной форме после основной части команды с указателями модификаций адресов в памяти могут находиться двухбайтный адрес для прямой адресации, однобайтноеd8или двухбайтноеd16смещение. Регистровые команды сопроцессора имеют сокращенные форматы.
При получении команды ESCсопроцессор с помощью центрального процессора формирует необходимые адреса памяти и начинает выполнение своей операции, не препятствуя центральному процессору продолжать вычисления по своей программе. Если нам в дальнейшей работе требуются результаты сопроцессора, то для подтверждения завершения предыдущей операции следует воспользоваться командойWAIT, которая переводит центральный процессор в режим ожидания аппаратного сигнала завершения операции в сопроцессоре и задается в безоперандном формате. Почти для всех команд сопроцессора, записанных на Ассемблере в форме мнемоник начинающихся с буквыF, генерируется код, начинающийся с кода операцииWAIT. Исключение составляют команды, начинающиеся с буквFNи не проверяющие особых случаев в команде, например:
FINIT; Начальный сброс без контроля особых случаев
FHCLEX; Сброс флагов особых случаев без их контроля
FNSAVEблок-приемник состояния среды и регистров
сопроцессора
FNSTCWслово-приемник регистра управления
FNSTSWслово-приемник регистрасостояния