Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция
Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.
СКАНИРОВАНИЕ И ЗАМЕНА
В процессе обработки текстовой информации может возникнуть необходимость замены определенных символов в тексте на другие, например, подстановка пробелов вместо различных редактирующих символов. В приведенном ниже фрагменте программы осуществляется сканирование cтроки STRING и замена символа амперсанд (&) на символ пробела. Когда команда SCASB обнаружит символ & (в примере это будет позиция STRING+8), то операция сканирования прекратится и регистр DI будет содержать aдрес STRING+9. Для получения адреса символа & необходимо уменьшить содержимое DI на единицу и записать по полученному адресу символ пробела.
STRLEN EQU 15 ;Длина поля STRING
STRING DB 'The time&is now'
...
CLD
MOV AL,'&' ;Искомый символ
MOV CX,STRLEN ;Длина поля STRING
LEA DI,STRING ;Адрес поля STRING
REPNE SCASB ;Сканировать
JNZ K20 ;Символ найден?
DEC DI ;Да - уменьшить адрес
MOV BYTE PTR[DI],20H ;Подставить пробел
K20: RET
Лекция(11,12,13,14): Сопроцессоры
В этой лекции речь идет о способах обмена информацией между ЦП и сопроцессором, о функциях математического сопроцессора и особенностях программирования ПЭВМ с сопроцессором. Рассматривается структура сопроцессоров семейства Intel x87 и блока вещественной арифметики (FPU) процессоров Pentium, а также организация сопроцессорного интерфейса ЦП семейства Motorola MC680х0.
Цель: познакомить с основными принципами организации сопроцессоров, сформировать умения и навыки, необходимые для понимания работы систем с сопроцессорами.
Сопроцессор - это специализированная интегральная схема, которая работает в содружестве с ЦП, но менее универсальна. В отличие от ЦП, сопроцессор не имеет счетчика команд. Сопроцессор предназначен для выполнения специфического набора функций, например: выполнение операций с вещественными числами - математический сопроцессор, подготовка графических изображений и трехмерных сцен - графический сопроцессор, цифровая обработка сигналов - сигнальный сопроцессор и др.
Использование сопроцессоров с различной функциональностью позволяет решать проблемы широкого круга:
Можно выделить два способа обмена информацией между ЦП и сопроцессором:
Один из наиболее распространенных типов сопроцессоров - математический сопроцессор. Математический сопроцессор предназначен для быстрого выполнения арифметических операций с плавающей точкой, предоставления часто используемых вещественных констант ( , log210, log2e, ln2, :), вычисления тригонометрических и прочих трансцендентных функций (tg, arctg, log, ...).
Большинство современных математических сопроцессоров для представления вещественных чисел используют стандарт IEEE 754-1985 "IEEE1) Standard for Binary Floating-Point Arithmetics". Старший разряд двоичного представления вещественного числа всегда кодирует знак числа. Остальная часть разбивается на две части: экспоненту и мантиссу. Вещественное число вычисляется как: (-1)S·2E·M, где S - знаковый бит числа, E - экспонента, M - мантисса. Если 1 M<2, то такое число называется нормализованным. При хранении нормализованных чисел сопроцессор отбрасывает целую часть мантиссы (она всегда 1), сохраняя лишь дробную часть. Экспонента кодируется со сдвигом на половину разрядной сетки, таким образом, удается избежать вопроса о кодировании знака экспоненты. Т.е. при 8-битной разрядности экспоненты код 0 соответствует числу -127, 1 - числу -126, ..., 255 числу +126 (экспонента вычисляется как код 127).
Стандарт IEEE-754 определяет три основных способа кодирования (типа) вещественных чисел.
Таблица 8.1. Типы (способы кодирования) вещественных чисел | ||
Тип | Диапазон значений(по модулю) | Двоичное представление |
вещественное ординарной точности (single precision) - 32 бит | 1,18·10-38... 3,40·1038 | |
вещественное двойной точности (double precision) - 64 бит | 2,23·10-308... 1,79·10308 | |
вещественное расширенной точности (extended precision) - 80 бит | 3,37·10-4932... 1,18·104392 |
Приведем пример
кодирования вещественного
178,62510 = 128 + 32 + 16 + 2 + 0,5 + 0,125 =
= 1·27 + 0·26 + 1·25 + 1·24 +
+ 0·23 + 0·22 + 1·21 + 0·20 +
+ 1·2-1 + 0·2-2 + 1·2-3 = 10110010,1012
Для представления этого числа в соответствии с IEEE-754 его нужно нормализовать (привести в экспоненциальный вид):
1,78625E102 = 1,0110010101E2111
В формате вещественного числа одинарной точности оно будет представлено так:
Следует отметить, что не все возможные комбинации такого представления соответствуют нормализованным вещественным числам. В общем случае все множество двоичных комбинаций делится на следующие классы (табл. 8.2):
Таблица 8.2. Представление чисел и нечисел на примере IEEE-754 single precision | |
Тип | Двоичное представление |
Ноль со знаком | |
Денормализованное вещественное число со знаком | |
Нормализованное вещественное число со знаком | |
Бесконечность со знаком | |
Нечисло |
Современные процессоры архитектуры IA-32 содержат блок операций с вещественными числами (Floating Point Unit - FPU). Функционирование этого блока во многом основано на архитектуре первого представителя семейства математических сопроцессоров Intel - 8087.
Сопроцессор 8087 был разработан в 1980 г. Структура сопроцессора 8087 показана на рис. 8.1. В схеме сопроцессора 8087 можно выделить две подсистемы: устройство шинного интерфейса и устройство с плавающей точкой. Развитием этого семейства стал сопроцессор 80287, созданный в 1985 году. Основные изменения произошли только в устройстве шинного интерфейса. В отличие от 8087, сопроцессор 80287 не имеет доступа к шине адреса, поэтому все обращения к памяти выполняет ЦП. В сопроцессоре 80387 изменения коснулись устройства с плавающей точкой: изменилась схема обработки ошибок, а также был реализован больший набор трансцендентных функций.
Рис. 8.1. Структура сопроцессора 8087
Выпуск очередного поколения ЦП фирмы Intel ознаменовался внедрением блока вещественной арифметики в структуру ЦП. Первым таким представителем семейства процессоров стал i486DX.
В пятом поколении процессоров интеграция блока FPU в суперскалярную архитектуру позволила значительно повысить эффективность выполнения операций с вещественными числами. Блок FPU может выполнять одну операцию с плавающей точкой в каждом такте или же получать и одновременно выполнять 2 команды с плавающей точкой, одной из которых должна быть команда обмена. Команды с плавающей точкой проходят по целочисленному конвейеру (обычно только по U-конвейеру - 5 ступеней) и передаются на исполнительные ступени конвейера FPU (3 ступени). В целом же, несмотря на то, что блок FPU интегрирован в центральный процессор, этот блок работает независимо и одновременно с устройством целочисленных вычислений.
Дальнейшее
развитие этого семейства сопровождалось
дополнением набора команд блока FPU
специальными функциональными
В целом базовая программная модель всех перечисленных сопроцессоров и блока FPU у IA-32 сходная (рис. 8.2): регистровый стек (восемь 80-битных регистров R0-R7), слово тегов, регистр управления, регистр состояния, указатель команды и указатель данных.
Для хранения данных в сопроцессоре предназначены регистры R0-R7. Эти регистры организованы в стек, и доступ к ним производится относительно вершины стека - ST. Номер регистра, соответствующего вершине стека, хранится в регистре состояния (поле TOS). Как и у ЦП, стек сопроцессора растет к регистрам с меньшими адресами. Команды, которые производят запоминание и извлечение из стека, передают данные из текущего регистра ST, а затем производят инкремент поля TOS в регистре состояния. Многие команды сопроцессора допускают неявное обращение к вершине стека, обозначаемой ST или ST(0). Для указания i-го регистра относительно вершины используется обозначение ST(i), где I = 0,:,7. Например, если поле TOS регистра состояния содержит значение 0112 (вершиной стека является регистр R3), то команда FADD ST,ST(2) суммирует содержимое регистров R3 и R5. Стековая организация упрощает программирование подпрограмм, допуская передачу параметров в регистровом стеке сопроцессора.