Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Asm_lab-Rus.docx
Скачиваний:
12
Добавлен:
27.08.2019
Размер:
239 Кб
Скачать
☆
    1. Задания на лабораторную работу.

  1. Написать программу, которая читает координаты точки (x,y,z) из стандартного устройства ввода (консоль), вызывает другую программу для расчета значений функции из лабораторной работы №1 и передает полученные данные вызванной программе по каналу. После расчета, вызванная программа по этому же каналу возвращает полученный результат в вызвавшую программу, которая и выводит данные на экран.

    1. Содержание отчета.

Отчет должен содержать:

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

    1. Контрольные вопросы.

  1. Что такое канал? Для чего он предназначен.

  2. Необходимы ли какие-либо средства для синхронизации процессов взаимодействующих с помощью каналов?

  3. Каким образом достигается возможность взаимодействия процессов в помощью каналов?

  4. Каким образом осуществляется отладка одновременно нескольких процессов?

  1. Лабораторная работа №7 Использование FPU для вычислений с плавающей точкой.

    1. Цель работы

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

    1. Указания по подготовке к выполнению лабораторной работы

При подготовке к выполнению лабораторной работы необходимо ознакомится с материалом лекций, который посвящен представлению данных с плавающей точкой в памяти ЭВМ, структурой и набором регистров FPU, системе команд FPU.

    1. Рекомендации по выполнению лабораторной работы

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

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

Таблица 7.1 – Типы данных FPU

Тип данных

Бит

Количество значащих цифр

Пределы

Целое слово

16

4

-32768 — 32767

Короткое целое

32

9

-2*109 — 2*109

Длинное целое

64

18

-9*1018 — 9*1018

Упакованное десятичное

80

18

-99..99 — +99..99 (18 цифр)

Короткое вещественное

32

7

1.18*10-38 — 3.40*1038

Длинное вещественное

64

15—16

2.23*10-308 — 1.79*10308

Расширенное вещественное

80

19

3.37*10-4932 — 1.18*104932

Вещественные числа хранятся, как и все данные, в форме двоичных чисел. Двоичная запись числа с плавающей запятой аналогична десятичной, только позиции справа от запятой соответствуют не делению на 10 в соответствующей степени, а делению на 2. Вещественное число представляется тремя частями: знак, мантисса и экспонента. Например: 1,01b * 2-1. Данное число является положительным, имеет мантиссу 1,01 и экспоненту -1. Под каждую из указанных частей должна быть выделена память. В зависимости от размера выделяется разное количество бит под мантиссу и экспоненту (табл. 7.2). Значение экспоненты хранят в виде суммы с некоторым числом так, чтобы хранить всегда только положительное число и чтобы было легко сравнивать вещественные числа. Кроме того, вещественные числа хранятся в нормализованном виде, т.е. первая цифра мантиссы всегда равна 1, так что ее можно не писать, увеличивая тем самым точность представления числа дополнительно на 1 бит.

Таблица 7.2 – Распределение памяти под вещественное число

Тип данных

Знак (бит)

Мантисса (Биты)

Экспонента (Биты)

Добавляемое число

Короткое вещественное

31

30 – 23 (8 бит)

22 – 0 (23 бита)

+128

Длинное вещественное

63

62 – 52 (11 бит)

51 – 0 (52 бита)

+1024

Расширенное вещественное

79

78 – 64 (15 бит)

63 – 0 (64 бита)

+16 383

FPU предоставляет восемь регистров для хранения данных и пять вспомогательных регистров.

Регистры данных (R0 – R7) не адресуются по именам, как регистры основного процессора. Вместо этого эти восемь регистров рассматриваются как стек, вершина которого называется ST, а более глубокие элементы — ST(1), ST(2) и так далее до ST(7). Если, например, в какой-то момент времени регистр R5 называется ST, то после записи в этот стек числа оно будет записано в регистр R4, который станет называться ST, R5 станет называться ST(1) и т.д.

Регистр состояний 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 (флаг С1 теряется).

Биты 0 – 5 отражают различные ошибочные ситуации, которые могут возникать при выполнении команд FPU. Они рассмотрены в описании управляющих регистров.

Регистр управления CR:

Биты 15 – 13 — зарезервированы.

Бит 12 «IC» — управление бесконечностью (поддерживается для совместимости с 8087 и 80287 — вне зависимости от значения этого бита +∞ > -∞).

Биты 11 – 10 «RC» — управление округлением.

Биты 9 – 8 «PC» — управление точностью.

Биты 7 – 6 — зарезервированы.

Бит 5 «РМ» — маска неточного результата.

Бит 4 «UM» — маска антипереполнения.

Бит 3 «ОМ» — маска переполнения.

Бит 2 «ZM» — маска деления на ноль.

Бит 1 «DM» — маска денормализованного операнда.

Бит 0 «IM» — маска недействительной операции.

Биты RC определяют способ округления результатов команд FPU до заданной точности (табл. 10).

Таблица 7.3 – Способы округления

Значение RC

Способ округления

0

к ближайшему числу

1

к отрицательной бесконечности

2

к положительной бесконечности

3

к нулю

Биты PC определяют точность результатов команд FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR и FSQRT (табл. 11).

Таблица 7.4 – Точность результатов

Значение PC

Точность результатов

0

одинарная точность (32-битные числа)

1

зарезервировано

2

двойная точность (64-битные числа)

3

расширенная точность (80-битные числа)

Биты 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) и адрес ее операнда соответственно и используются в обработчиках исключений для анализа вызвавшей его команды.

Таблица 7.5 – Основные команды FPU

Команда

Описание

Команды пересылки данных

FLD ист.

Загрузить вещественное число в стек

FST прием.

Скопировать вещественное число из стека

FSTP прием.

Считать вещественное число из стека

Базовая арифметика FPU

FADD прием., ист.

Сложение вещественных чисел

FADDP прием.,ист.

Сложение с выталкиванием из стека

FSUB прием.,ист.

Вычитание вещественных чисел

FSUBP прием.,ист.

Вычитание с выталкиванием из стека

FSUBR прием.,ист.

Обратное вычитание вещественных чисел

FSUBRP прием.,ист.

Обратное вычитание с выталкиванием

FMUL прием.,ист.

Умножение вещественных чисел

FMULP прием.,ист.

Умножение с выталкиванием из стека

FDIV прием.,ист.

Деление вещественных чисел

FDIVP прием.,ист.

Деление с выталкиванием из стека

FDIVR прием.,ист.

Обратное деление вещественных чисел

FDIVRP прием.,ист.

Обратное деление с выталкиванием

FSQRT

Извлечь квадратный корень

Команды сравнения FPU

FCOM ист.

Сравнить вещественные числа

FCOMP ист.

Сравнить и вытолкнуть из стека

FCOMPP ист.

Сравнить и вытолкнуть из стека два числа

FCOMI ист.

Сравнить и установить EFLAGS

FCOMIP ист.

Сравнить, установить EFLAGS и вытолкнуть

FUCOMI ист.

Сравнить без учета порядков и установить EFLAGS

FUCOMIP ист.

Сравнить без учета порядков, установить EFLAGS и вытолкнуть из стека

Трансцендентные операции FPU

FSIN

Синус

FCOS

Косинус

FSINCOS

Синус и косинус

FPTAN

Тангенс

FPATAN

Арктангенс

F2XMI

Вычисление 2х-1

FYL2X

Вычисление у*log2(x)

FYL2XP1

Вычисление у*log2(x+1)

Команды управления FPU

FINIT

Инициализировать FPU

FNINIT

Инициализировать FPU без ожидания

FFREE операнд

Освободить регистр данных

FINCSTP

Увеличить указатель вершины стека

FDECSTP

Уменьшить указатель вершины стека

FSTSW приемник

Сохранить регистр SR

Прежде чем начинать вычисления желательно инициализировать FPU командой FINIT. При этом все вспомогательные регистры примут значение по умолчанию, регистры данных будут помечены как пустые.

Для организации ветвлений используются команды условного и безусловного переходов центрального процессора. В зависимости от используемого поколения процессора, команды сравнения, производимые в FPU, могут влиять либо на флаги условий в регистре SR FPU, либо на регистр EFLAGS. Например, команда FCOM устанавливает флаги С0, С2, С3. Для того чтобы она имела смысл необходимо отразить установленные флаги в регистр EFLAGS. Для этого необходимо сохранить регистр SR в памяти или регистре основного процессора командой FSTSW, а затем отразить их в EFLAGS.

FCOM ST(0),ST(1) ; сравнение

FSTSW ax ; сохранение регистра SR в регистре ax

SAHF ; отображение флагов условий на EFLAGS

JG next ; условный переход

Для преобразования чисел с плавающей точкой в строку можно использовать функцию библиотеки masm32 FloatToStr.

FloatToStr PROC fpin:QWORD, szDbl:PTR CHAR

fpin – число с плавающей точкой;

szDbl – указатель на строковый буфер размером 20 байт.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]