assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 103
Текст из файла (страница 103)
17.3. Физическая и логическая нумерации регистров стека сопроцессорапараметров подпрограмме. Для повышения гибкости подпрограмм (в разработкеи использовании) нежелательно привязывать их по передаваемым параметрам к аппаратным ресурсам (физическим номерам регистров сопроцессора). Гораздо удобнее задавать порядок следования передаваемых параметров в виде логических номеров, поскольку такой способ передачи однозначен и не требует от разработчиказнания лишних подробностей о вариантах аппаратной реализации сопроцессора.Логическая нумерация регистров сопроцессора, поддерживаемая на уровне системы команд, идеально реализует эту идею. При этом не имеет значения, в какойфизический регистр стека сопроцессора были помещены данные перед вызовом452Глава 17. Архитектура и программирование сопроцессораподпрограммы, определяющим является только порядок следования параметровв стеке.
По этой причине подпрограмме достаточно знать не место, а только порядок размещения передаваемых параметров в стеке.Перед тем как приступить к описанию команд и данных, с которыми работаетсопроцессор, отметим, каким образом «уживаются» между собой эти два разныхвычислительных устройства — процессор и сопроцессор. Каждое из них имеет своинесовместимые друг с другом системы команд и форматы обрабатываемых данных. Несмотря на то что сопроцессор архитектурно представляет собой отдельноевычислительное устройство, он не может существовать отдельно от основного процессора. Ранее уже было отмечено, что первые модели процессоров Intel (18086,i286, i386) и сопроцессоров (соответственно, 18087, 1287, 1387) выполнялись какотдельные устройства — сопроцессор при необходимости вставлялся в специальный разъем на системной плате.
Начиная с модели i486 сопроцессор и основнойпроцессор производятся в одном корпусе и являются физически неделимыми, тоесть архитектурно это по-прежнему два разных устройства, а аппаратно — одно.Процессор и сопроцессор, являясь двумя самостоятельными вычислительными устройствами, могут работать параллельно. Но этот параллелизм касается только их внутренней работы над исполнением очередной команды. Как реализованэтот параллелизм, в чем его суть и особенности? Оба процессора подключены к общей системной шине и имеют доступ к одинаковой информации. Инициирует процесс выборки очередной команды всегда основной процессор. После выборки команда попадает одновременно в оба процессора. Любая команда сопроцессора имееткод операции, первые 5 битов которого имеют значение 11011.
Когда код операции начинается этими битами, то основной процессор по дальнейшему содержимому кода операции выясняет, требует ли данная команда обращения к памяти.Если это так, то основной процессор формирует физический адрес операнда и обращается к памяти, после чего содержимое ячейки памяти выставляется на шинуданных. Если обращение к памяти не требуется, то основной процессор заканчивает работу над данной командой (не делая попытки ее исполнения!) и приступаетк декодированию следующей команды из текущего входного командного потока.Что же касается сопроцессора, то выбранная команда, как уже было отмечено, попадает к нему и к основному процессору одновременно.
Сопроцессор, определивпо первым пяти битам, что очередная команда принадлежит его системе команд,начинает ее исполнение. Если команда требует операнда в памяти, то сопроцессоробращается к шине данных за чтением содержимого ячейки памяти, которое к этому моменту должно быть предоставлено основным процессором. Из этой схемывзаимодействия следует, что в определенных случаях необходимо согласовыватьработу обоих устройств. К примеру, если во входном потоке сразу за командойсопроцессора следует команда основного процессора, использующая результатыработы предыдущей команды, то сопроцессор не успеет выполнить свою командуза то время, пока основной процессор, пропустив сопроцессорную команду, выполняет свою.
Очевидно, что логика работы программы нарушается. Возможнаи другая ситуация. Если входной поток команд содержит последовательность изнескольких крманд сопроцессора, то, очевидно, что процессор, в отличие от сопроцессора, проверит их очень быстро, чего он не должен делать, так как обеспечиваетвнешний интерфейс для сопроцессора. Эти и другие более сложные ситуации при-Архитектура сопроцессора453водят к необходимости синхронизировать между собой работу двух процессоров.В первых моделях процессоров подобная синхронизация проводилась программистом «вручную» путем вставки перед или после каждой команды сопроцессораспециальной команды WAIT или FWAIT.
Работа данной команды заключалась в приостановке работы основного процессора до тех пор, пока сопроцессор не закончитработу над последней командой. Начиная с модели процессора i486, подобная синхронизация выполняется командами WAIT/FWAIT, которые введены в алгоритмработы большинства команд сопроцессора, и программисту нет необходимость заботиться об этом явно. Но некоторые команды из группы команд управления сопроцессором (см. далее) имеют два варианта реализации — с синхронизацией (ожиданием) и без нее.Из всего сказанного можно сделать важный вывод: использование сопроцессора является совершенно прозрачным для программиста. В общем случае программисту следует воспринимать сопроцессор как набор дополнительных регистров,для работы с которыми предназначены специальные команды.
Для эффективногоприменения сопроцессора программист должен хорошо разобраться в структуререгистров и логике их использования. Поэтому перед тем как приступить к рассмотрению команд и данных, с которыми работает сопроцессор, приведем описание структуры некоторых регистров сопроцессора.Регистр состояния SWRРанее было отмечено, что регистр SWR отражает текущее состояние сопроцессорапосле выполнения последней команды. Далее перечислены поля, из которых структурно состоит регистр SWR (см. рис.
17.2).- Шесть флагов исключительных ситуаций.Бит SF (Stack Fault) — ошибка работы стека сопроцессора. Бит устанавливается в единицу, если возникает одна из трех исключительных ситуаций (см. ранее) — РЕ, UE или IE. В частности, его установка информирует о попытке записив заполненный стек или, напротив, попытке чтения из пустого стека. После тогокак вы проанализировали этот бит, его нужно снова установить в ноль вместес битами РЕ, UE или IE (если они были установлены);ш Бит ES (Error Summary) сигнализирует о суммарной ошибке в работе сопроцессора.
Бит устанавливается в единицу, если возникает любая из шести исключительных ситуаций, о которых будет рассказано далее.ii Четыре бита СО...СЗ (Condition Code) представляют собой код условия. Назначение этих битов аналогично флагам в регистре EFLAGS основного процессора —они отражают результат выполнения последней команды сопроцессора. В приложении А для некоторых команд сопроцессора приведена интерпретация битов СО...СЗ.Ш Трехразрядное поле ТОР содержит указатель регистра текущей вершины стека.Почти половину регистра SWR занимают биты (флаги) регистрации исключительных ситуаций. Исключительная ситуация — особый тип прерываний. Необходимо заметить [8], что прерывания, поддерживаемые процессором Intel, по месту их возникновения классифицируются на внешние и внутренние.
Внутренние454Глава 17. Архитектура и программирование сопроцессорапрерывания возникают в ходе работы текущей программы и делятся на синхронные (по команде int) и асинхронные, называемые исключениями, или особыми случаями. Таким образом, исключения — это разновидность прерываний, с помощьюкоторых процессор информирует программу о некоторых особенностях ее реального исполнения. Сопроцессор также обладает способностью возбуждения подобных прерываний при возникновении определенных ситуаций (не обязательноошибочных).
Все возможные исключения сведены к шести типам, каждому из которых соответствует один бит в регистре SWR. Программисту совсем не обязательно писать обработчик для реакции на ситуацию, приведшую к некоторому исключению. Сопроцессор умеет самостоятельно реагировать на многие из них. Это такназываемая обработка исключений по умолчанию. Для того чтобы запретить сопроцессору обработку определенного типа исключения по умолчанию, необходимо это исключение замаскировать.
Такое действие выполняется путем установкив единицу нужного бита в управляющем регистре сопроцессора CWR (рис. 17.4).Приведем типы исключений, фиксируемые с помощью регистра SWR:м IE (Invalide operation Error) — недействительная операция;* DE (Denormalized operand Error) — денормализованный операнд;ti ZE (divide by Zero Error) — ошибка деления на нуль;li OE (Overflow Error) — ошибка переполнения (возникает в случае выхода порядка числа за максимально допустимый диапазон);я UE (Underflow Error) — ошибка антипереполнения (возникает, когда результатслишком мал);ж РЕ (Precision Error) — ошибка точности (устанавливается, когда сопроцессоруприходится округлять результат из-за того, что его точное представление невозможно; так, сопроцессору, как и читателю, никогда не удастся точно разделить 10 на 3).При возникновении любого из этих шести типов исключений устанавливаетсяв единицу соответствующий бит в регистре SWR вне зависимости от того, было лизамаскировано это исключение в регистре CWR или нет.
Более подробно об исключениях, в частности, об условиях их возникновения, рассказывается в разделе «Исключения сопроцессора и их обработка».Регистр управления CWRРегистр управления сопроцессором CWR определяет особенности обработки численных данных (рис. 17.4). Он состоит:s из шести масок исключений;* поля управления точностью PC (Precision Control);* поля управления округлением RC (Rounding Control).Регистр управления CWRГС15PCрUоZd13 1110 98 7654321Рис.