- •8.091402 “Системы управления и автоматики”
- •Введение
- •Порядок выполнения работы.
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Строковые операции
- •Лабораторная работа №2 Изучение способов организации ветвлений и циклов на языке ассемблер
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Копирование строки
- •Сравнение строк
- •Сканирование строки.
- •Чтение из строки
- •Запись в строку
- •Чтение строки из порта
- •Запись строки в порт
- •Рекомендации по выполнению лабораторной работы
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Искажение имен
- •Подключение библиотек
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Лабораторная работа №4 Управление памятью.
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Содержание отчета
- •В данной лабораторной работе необходимо выполнить следующее:
- •Задания на лабораторную работу.
- •Контрольные вопросы и задания
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Задания на лабораторную работу.
- •Задания на лабораторную работу.
- •Содержание отчета.
- •Контрольные вопросы.
- •Надруковано в учбово-виробничому
- •61166, Харкiв, просп. Ленiна, 14.
Задания на лабораторную работу.
Написать программу, которая читает координаты точки (x,y,z) из стандартного устройства ввода (консоль), вызывает другую программу для расчета значений функции из лабораторной работы №1 и передает полученные данные вызванной программе по каналу. После расчета, вызванная программа по этому же каналу возвращает полученный результат в вызвавшую программу, которая и выводит данные на экран.
Содержание отчета.
Отчет должен содержать:
Цель работы, задание, описание алгоритма работы программы, распечатку исходных текстов программы с пояснениями, результаты, выводы с описанием сложностей возникших при выполнении работы.
Контрольные вопросы.
Что такое канал? Для чего он предназначен.
Необходимы ли какие-либо средства для синхронизации процессов взаимодействующих с помощью каналов?
Каким образом достигается возможность взаимодействия процессов в помощью каналов?
Каким образом осуществляется отладка одновременно нескольких процессов?
Лабораторная работа №7 Использование FPU для вычислений с плавающей точкой.
Цель работы
Ознакомление с функциональными возможностями систем программирования на языке ассемблер, структурой подпрограмм использующей вычисления с плавающей точкой. Организация вычислений с использованием FPU.
Указания по подготовке к выполнению лабораторной работы
При подготовке к выполнению лабораторной работы необходимо ознакомится с материалом лекций, который посвящен представлению данных с плавающей точкой в памяти ЭВМ, структурой и набором регистров FPU, системе команд FPU.
Рекомендации по выполнению лабораторной работы
Для выполнения лабораторной работы необходимо запустить среду разработки \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 байт.
