Материал: Уч_пос_АрхКомп_2017

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Независимо от наличия сопроцессора, выполнение команд FPU может быть осуществлено тремя способами:

  1. С использованием библиотеки альтернативной математики: считается, что сопроцессор отсутствует и выполнение команд FPU моделируется на уровне операций основного процессора.

  2. С использованием библиотеки эмулятора: автоматически определяется наличие сопроцессора, и если он есть, то выполняет команды FPU, а иначе их выполнение эмулируется (моделируется на уровне микро-операций) основным процессором.

  3. При отсутствии математического сопроцессора возникает прерывание и выполнение программы прекращается.

Первый способ – самый медленный и сейчас практически не применяется. Второй способ не всегда совместим с некоторыми резидентными программами (одни и те же прерывания используются для эмулятора и резидентных программ). Третий способ самый быстрый и сейчас является основным.

Назначение математического сопроцессора

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

Типы данных математического сопроцессора

Сопроцессор поддерживает 7 типов данных: три целых (16 бит – Word Integer, 32 бит – Short Integer и 64 бит– Long Integer), 80-битные двоично-десятичные целые (Packed Decimal) и три формата с плавающей запятой, представленые в табл. 3.4.

Таблица 3.4

Разрядность (порядка-p/мантиссы-m)

Точность в десятичных разрядах

Диапазон изменения

32 (8/24) Короткое вещественное

6 / 7

10-38 - 1037

64 (11/53) Длинное вещественное

15 / 16

10-308 - 10307

80 (15/65) Расширенное вещественное

18 / 19

10-4932 - 104931

Сопроцессор выполняет все вычисленя в 80-битном раширенном формате, а 32-битный и 64-битный форматы используются для обмена данными с основным процессором и памятью.

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

p m

Положительная бесконечность 0 | 1 … 1 00 … 0

Отрицательная бесконечность 1 | 1 … 1 00 … 0

Неопределенность 1 | 1 … 1 10 … 0

Не число 0 | 1 … 1 1Х…Х , где Х…Х  0

Регистры математического сопроцессора

Сопроцессор предоставляет для хранения и обработки данных восемь дополнительных 80-битных регистров R0–-R7, организованных в виде закольцованного аппаратного стека ST(0) – ST(7), вершина которого обозна- чается ST, ST(0) или TOP, а более глубокие регистры ST(1) – ST(7). Так, например, если ST = R5, то ST(1) = R6, ST(2) = R7, ST(3) = R0 и т. д.

Кроме того, сопроцессор использует пять вспомогательных регистров:

  1. Регистр управления CR – задает режим обработки данных: маскирование ошибок (некорректная операция, деление на 0, переполнение и т.д.), точность обработки (расширенная, двойная, одинарная), способы округления (к ближайшему числу, к нулю, к +∞ или к -∞).

  2. Регистр состояния SR – содержит: флаги особых случаев, возникающих в результате выполнения операций (IE - некорректная операция, DE - денормализованный операнд, ZE – деление на ноль, OE – переполнение, UE – антипереполнение, PE – неточный результат); флаги условий, возникающие при операциях сравнения; поле указателя вершины стека ST или TOP; бит B занятости сопроцессора.

  3. Регистр тегов TW – содержит двухбитовое поле для каждого из восьми числовых регистров сопроцессора

TW(i) ST(i)

00 вещественное число, не равное нулю

01 вещественное число, равное нулю

10 не число

11 не инициализировано

  1. Регистр указателя команды FIP – содержит адрес последней выполненной команды.

  2. Регистр указателя операнда DIP – содержит адрес операнда последней выполненной команды.

Два последних регистра используются обработчиком исключений при анализе вызвавшей его команды.

При программировании обработки выражений в сопроцессоре они представляются в виде польской инверсной записи (ПОЛИЗ или RPN – Reversed Poland Notation). Любое выражение преобразуетмя к постфиксному виду (бесскобочная запись).

Примеры:

  1. f:= (a + b) * pi – c преобразуется к виду ab + pi * c – f :=

  2. f:= atan ( sqrt (x2 / (x2 - 1) ) преобразуется к виду xx * xx * 1 - / sqrt atan f :=

Фрагмент программы на Ассемблере, реализующей с помощью FPU вычисление выражения из первого примера, имеет вид.

Data Segment

a DQ 2.5

b DQ 6.0

c DQ 3.5

f DQ ?

Data EndS

Code Segment

Assume cs : Code, ds : Data

Public f

Expression Proc Far

Fld a ; a  st(0)

Fld b ; b  st(0), a  st(1)

Fadd ; st(0) + st(1)  st(0) или (a+b)  st(0)

Fld pi ; pi  st(0), (a+b)  st(1)

Fmnl ; st(0) * st(1)  st(0) или (a+b)*pi  st(0)

Fld c ; c  st(0), (a+b)*pi  st(1)

Fsub ; st(0) – st(1)  st(0) или (a+b)*pi - c  st(0)

Fstp f ; f:= st(0); st(1)  st(0)

Ret

Expression EndP

Code EndS

Краткие сведения по программированию на языке Ассемблера IBM PC, используемом здесь и далее для иллюстрации управления обработкой данных в ЭВМ, приведены в приложении 2.

      1. Организация прерываний в процессорах Intel x86

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

Прерывания бывают двух видов:

1) программные, вызываемые по команде процессора, и называемые исключениями;

2) аппаратные, вызываемые внешним по отношению к программе сигналом (например, поступающим от внешнего устройства) и называемые просто прерываниями.

Исключения делятся на три типа: ошибки, ловушки и остановы. Ошибка происходит до выполнения команды, например, если такой команды не существует, или выполняется обращение к некоторой привилегированной команде или запрещенной для доступа области данных. Адрес возврата в этом случае указывает на ошибочную команду. Ловушка – прерывание, возникающее после выполнения команды (например, для организации режима пошагового выполнения программы под управлением отладчика). Адрес возврата указывает на следующую команду. Останов – ситуация с неопределенным результатом. Возврат может вообще не происходить.

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

Аппаратные прерывания – прерывания, поступающие от внешних устройств или аппаратных средств процессора асинхронно по отношению к выполняемой программе. Делятся на следующие группы:

1. Прерывания низкого уровня.

Номера веторов прерываний: NВП = 0…1Fh :

- прерывания от схем процессора 00..07 (0 – деление на ноль; 1 – пошаговый режим; 2 – немаскируемое прерывание; 3 – точка останова; 4 – прерывание по переполнению; 5 – печать содержимого экрана, либо прерывание по команде BOUND; 6 – прерывание по отсутствию команды; 7 – прерывание по отсутствию FPU).

- прерывания от контроллера прерываний (микросхема 8259) 8…0Fh (8 – системный таймер; 9 – клавиатура; 0Ah – обслуживание видеоадаптера; 0Eh – обслуживание жесткого диска).

- прерывания BIOS 0Ah…1Fh (0Ah – обмен данными с дисплеем; 0Bh – возвращение объема памяти; 0Ch – обмен данными с диском; 0Dh – последовательный порт ввода вывода и т.д.).

2. Прерывания среднего уровня.

NВП=20h…5Fh

Здесь прерывание с номером 21h представляет набор функций ОС для работы с файлами управления задачами, выделения и освобождения памяти, работы с виртуальной памятью).

Прерывания пользователей.

NВП=60h…7Fh (прерывания от 70h используются для различных устройств).

3. Прерывания языков высокого уровня.

Уровни приоритета

Прерывания, обслуживаемые контроллером прерываний 8259, имеют 16 уровней приоритета с запросами IRQ0 - IRQ15. Самый высокий уровень приоритета имеет запрос IRQ0.

IRQ0 (INT 8) – прерывания от системного таймера;

IRQ1 (INT 9) – прерывания от клавиатуры;

IRQ2 – размножитель приоритетных уровней;

IRQ8 (INT 70) – прерывания от часов реального времени;

IRQ9 (INT 0Аh) – прерывание обратного хода луча и звуковой карты;

IRQ10- IRQ12 – резерв для дополнительных устройств;

IRQ13 (INT 2) – прерывания по ошибке FPU;

IRQ14 (INT 76h) и IRQ15 (INT 77h) – прерывания от контроллеров жесткого диска IDE1, IDE2.

IRQ3 (INT 0Bh) – прерывания от последовательного порта COM2;

IRQ4 (INT 0Ch) – прерывания от последовательного порта COM1;

IRQ5 (INT 0Dh) – прерывание от LPT2 используется дополнительным устройствами;

IRQ6 (INT 0Eh) – прерывания от прерывания от магнитного диска;

IRQ7 (INT 0Fh) – прерывания от LPT1 используется дополнительным устройствами.

Маскируемые прерывания

Целью маскирования или запрета прерываний являются запрещения прерывания выполнения критических (по доступу к ресурсам) частей программы или запрещение на некоторое время долго обслуживаемых прерываний, например, в системах реального времени.

Способы реализации.

1. Общее маскирование.

Управление реализуется командами CLI, STI, которые соответственно сбрасывают в ноль или устанавливают в единицу флаг разрешения прерывания IF.

2) Выборочное маскирование.

Засылка определенного кода в регистр маски контроллера 8259. В этом контроллере имеется три основных регистра:

IRR – регистр запроса прерывания;

ISR – регистр обслуживания прерывания (порт 20h);

IMR – регистр маскирования прерывания (порт 21h.

К регистру IRR подключены все линии запросов IRQ0..IRQ15. Регистр ISR хранит приоритет текущего обслуживаемого прерывания. Если запрос прерывания, поступивший в регистр IRR не замаскирован, то происходит сравнение приоритетов PRIRR и PRISR . Если PRIRR > PRISR, то поступивший запрос принимается на обслуживание.

Например, запрет прерываний от жесткого диска обеспечивается командами

mov al, 01000000b; маскируются запросы прерывания от жесткого диска

out 21h

------

mov al, 0

out 21h

Разработка собственных прерываний

Причины: необходимость создания собственной подпрограммы, резидентной в памяти и доступной из любой программы; необходимость дополнения функций существующих прерываний; использование холостых прерываний, телом которых является IRET.

Существует два способа заполнения вектора прерывания адресом своего обработчика:

- низкоуровневый – командой mov записать по адресу вектора прерывания адрес сегмента и смещения обработчика;

- с использованием функций операционной системы: функции 25 и 35 прерывания Int 21h позволяют устанавливать новое и получать старое значение адреса обработчика вектора прерывания.

Пример. Пусть нам требуется установить собственный обработчик прерывания по номеру N=60

Data Segment

old_cs dw 0; буфер для хранения

old_ip dw 0; старого вектора прерывания (ВП)

---------

old_vp dd 0;

Data ENDS

Code Segment

;сохранение адреса старого обработчика

mov ax, 3560h

int 21; старый_ВП_cses, старый_ВП_ipbx

mov old_cs, es

mov old_ip, bx

;задание адреса нового обработчика в ВП 60h

push ds

mov dx, offset New_sub

mov ax, seg New_sub

mov ds, ax

mov ax, 2560h

int 21h

pop ds

;новый обработчик прерывания 60h

New_sub proc far

push ax

; тело нового обработчика

pop ax

mov al, 20 ; загрузка в регистр ISR кода 20

out 20h ; для разрешения прерываний более низкого уровня

iret

---------

Final EQU $

---------

New_sub ENDP

;восстановление старого ВП

lds dx, DWORD PTR OLD_CS

mov ax, 2560h

int 21h

Возможные проблемы:

  • если данные передаются через память, нужно тщательно следить за содержимым регистра DS; лучше данные передавать через регистры или стек;

  • если возможно прерывание обработчика через Ctrl+Break, необходимо предусмотреть восстановление адреса старого обработчика;

  • требуется минимизировать код обработчика прерывания, так как на время его выполнения может быть запрещено выполнение других прерываний.

Перекрытие обработчика прерываний

Существующие обработчики прерываний DOS и BIOS сложно поддаются модификации на уровне исходных кодов и для добавления новых функций требуется реализовать следующий механизм:

  • создать новый обработчик прерываний (реализующий дополнительные функции), который вызывает старый (системный), размещенный по новому неиспользованному ранее вектору в диапазоне 60h…70h;

  • перенести адрес старого обработчика прерываний в новый вектор прерывания;

  • изменить вектор прерывания с системным номером таким образом, чтобы он указывал на новый обработчик прерывания;

  • завершить программу установки нового обработчика и оставить ее резидентной в памяти.

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

push f

call old_handler;

если дополнительные функции реализуются после выполнения старого обработчика, либо в вызывающую процедуру командой

jmp cs:old_handler;

если дополнительные функции реализуются до выполнения старого обработчика.

Разработка резидентных обработчиков прерываний

Такие обработчики называются TSR-процедуры (Terminate and Stay Resident – завершить и оставить в памяти). Для оставления обработчика в памяти перед его завершением командой ret следует вызвать прерывания int 27h (более старая версия) или int 31h (более новая версия).

Резидентный обработчик обычно пишется в виде модуля типа com и для его разработки необходимо:

  • наличие свободного вектора прерывания и указание метки конца обработчика для int 27h (определение длины обработчика +100PSP);

  • для int 31h длина обработчика задается в параграфах.

Для минимизации длины кода обработчика инициализирующую часть выносят за его пределы.

Cod_s Segment

Begin: jmp short set_up; переход на инициализацию

Rezid_h: proc far

push ds

;тело процедуры обработчика прерывания

pop ds

iret

Final EQU $; текущее значение счетчика размещения

Rezid_h ENDP

Set_up: mov dx, offset Rezid_h

mov ax, 2568h; задание свободного ВП с номером 68h

int 21h

;завершение с оставлением в памяти

lea dx, Final

int 27h

ret

Cods ENDS

Источник: https://studfile.net/preview/15919868/