![]() КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Регистры FPU
FPU предоставляет восемь регистров для хранения данных и пять вспомогательных регистров. Регистры данных (R0 – R7) не адресуются по именам, как регистры основного процессора. Вместо этого эти восемь регистров рассматриваются как стек, вершина которого называется ST, а более глубокие элементы — ST(1), ST(2) и так далее до ST(7). Если, например, в какой-то момент времени регистр R5 называется ST (рис. 13), то после записи в этот стек числа оно будет записано в регистр R4, который станет называться ST, R5 станет называться ST(1) и т.д. Рис. 13. Регистры FPU
К регистрам R0 – R7 нельзя обращаться напрямую, по именам, но если процессор поддерживает расширение ММХ, то мантиссы, находящиеся в этих регистрах, становятся доступны, как ММ0 – ММ7. Регистр состояний SR содержит слово состояния FPU: Бит 15: В — занятость FPU — этот флаг существует для совместимости с 8087, и его значение всегда совпадает с ES. Бит 14: С3 — условный флаг 3. Биты 13 – 11: ТОР — число от 0 до 7, показывающее, какой из регистров данных R0 – R7 в настоящий момент является вершиной стека. Бит 10: С2 — условный флаг 2. Бит 9: С1 — условный флаг 1. Бит 8: С0 — условный флаг 0. Бит 7: ES — общий флаг ошибки — равен 1, если произошло хотя бы одно немаскированное исключение. Бит 6: SF — ошибка стека. Если С1 = 1, произошло переполнение (команда пыталась писать в непустую позицию в стеке), если С1 = 0, произошло антипереполнение (команда пыталась считать число из пустой позиции в стеке). Бит 5: РЕ — флаг неточного результата — результат не может быть представлен точно. Бит 4: UE — флаг антипереполнения — результат слишком маленький. Бит 3: ОЕ — флаг переполнения — результат слишком большой. Бит 2: ZE — флаг деления на ноль — выполнено деление на ноль. Бит 1: DE — флаг денормализованного операнда — выполнена операция над денормализованным числом. Бит 0: IE — флаг недопустимой операции — произошла ошибка стека (SF = 1) или выполнена недопустимая операция. Биты С0 – С3 употребляются так же, как и биты, состояния в основном процессоре, — их значения отражают результат выполнения предыдущей команды и используются для условных переходов; команды fstsw ax sahf копируют их значения в регистр FLAGS так, что флаг С0 переходит в CF, С2 — в PF, а С3 — в ZF (флаг С2 теряется). Биты 0 – 5 отражают различные ошибочные ситуации, которые могут возникать при выполнении команд FPU. Они рассмотрены в описании управляющих регистров. Регистр управления CR: Биты 15 – 13 — зарезервированы. Бит 12 «IC» — управление бесконечностью Биты 11 – 10 «RC» — управление округлением. Биты 9 – 8 «PC» — управление точностью. Биты 7 – 6 — зарезервированы. Бит 5 «РМ» — маска неточного результата. Бит 4 «UM» — маска антипереполнения. Бит 3 «ОМ» — маска переполнения. Бит 2 «ZM» — маска деления на ноль. Бит 1 «DM» — маска денормализованного операнда. Бит 0 «IM» — маска недействительной операции. Биты RC определяют способ округления результатов команд FPU до заданной точности (табл. 10). Таблица 10. Способы округления
Биты PC определяют точность результатов команд FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR и FSQRT (табл. 11). Таблица 11. Точность результатов
Биты 0 – 5 регистра CR маскируют соответствующие исключения — если маскирующий бит установлен, исключения не происходит, а результат вызвавшей его команды определяется правилами для каждого исключения специально. Регистр тегов TW содержит восемь пар бит, описывающих содержание каждого регистра данных, — биты 15 – 14 описывают регистр R7, 13 – 12 — R6 и т.д. Если пара бит (тег) равна 11, соответствующий регистр пуст. 00 означает, что регистр содержит число, 01 — ноль, 10 — нечисло, бесконечность, денормализованное число, неподдерживаемое число. Регистры FIP и FDP содержат адрес последней выполненной команды (кроме FINIT, FCLEX, FLDCW, FSTCW, FSTSW, FSTSWAX, FSTENV, FLDENV, FSAVE, FRSTOR и FWAIT) и адрес ее операнда соответственно и используются в обработчиках исключений для анализа вызвавшей его команды. Набор команд для работы с плавающей запятой в процессорах Intel достаточно разнообразен, чтобы реализовывать весьма сложные алгоритмы, и прост в использовании. Единственное, что может представлять определенную сложность, — почти все команды FPU по умолчанию работают с его регистрами данных как со стеком, выполняя операцию над числами в ST(0) и ST(1) и помещая результат в ST(0), так что естественной формой записи математических выражений для FPU оказывается обратная польская нотация (RPN). Эта форма записи встречается в программируемых калькуляторах, языке Форт и почти всегда неявно присутствует во всех алгоритмах анализа математических выражений: они сначала преобразовывают обычные выражения в обратные и только потом начинают их анализ. В обратной польской нотации все операторы указываются после своих аргументов, так что sin(x) превращается в х sin, a а+b превращается в a b +. При этом полностью пропадает необходимость использовать скобки, например: выражение (a+b)*7-d записывается как а b + 7 * d -. Посмотрим, как выражение, записанное в RPN, легко воплощается при помощи команд FPU на примере процедуры вычисления арксинуса. ; asin ; вычисляет арксинус числа, находящегося в st(0) (-1 <= х <= +1) ; по формуле asin(x) = atan(sqrt(x2/(1-x2))) ; (в RPN: x x * x x * 1 - / sqrt atan) ; результат возвращается в st(0), в стеке FPU должно быть ; два свободных регистра asin proc near; комментарий показывает содержимое стека FPU: ; первое выражение - ST(0), второе - ST(1) и т.д. ; х (начальное состояние стека) fld st(0); х, х fmul; x2 fld st(0); х2, х2 fld1; 1, x2, x2 fsubr; 1-х2, x2 fdiv; x2/(1-x2) fsqrt; sqrt(x2/(1-x2)) fld1; 1, sqrt(x2/(1-x2)) fpatan; atan(sqrt(x2/(1-x2))) ret asin endp Вычисление корней квадратного уравнения roots proc near fild 4; 4 fld a; a, 4 fld c; c, a, 4 fmul; c*a, 4 fmul; c*a*4 fld b; b, c*a*4 fld b; b, b, c*a*4 fmul; b*b, c*a*4 fsubr; b*b-c*a*4 fsqrt; sqrt(b*b-c*a*4) fstp d; - fld b; b fild 0; 0, b fsubr; -b fld d; d, -b fadd; -b+d fild 2; 2, -b+d fld a; a, 2, -b+d fmul; 2*a, -b+d fdivr; (-b+d)/2*a fstp x1; - fld d; d fld b; b, d fild 0; 0, b, d fsubr; -b, d fsubr; -b-d fild 2; 2, -b-d fld a; a, 2, -b-d fmul; 2*a, -b-d fdivr; (-b-d)/2*a fstp x2; - roots endp
Дата добавления: 2014-01-05; Просмотров: 1797; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |