Таблица 2.8
тип | название |
regs | data |
unsigned short int | sreg |
Структура _creg, включает в себя следующую структуру:
Таблица 2.9
тип | имя переменной | размер(бит) |
unsigned | IM | 1 |
unsigned | DM | 1 |
unsigned | ZM | 1 |
unsigned | OM | 1 |
unsigned | UM | 1 |
unsigned | PM | 1 |
unsigned | PC | 2 |
unsigned | RC | 2 |
Таблица 2.10
тип | название |
unsigned short int | creg |
Структура _twr, включает в себя следующую структуру:
Таблица 2.11
тип | имя переменной | размер(бит) |
unsigned char | pr0 | 2 |
структура _twr с полями в таблице 2.12
Таблица 2.12
типа | название |
unsigned short int | twr |
2.2 Выбор методов решения задачи и разработка основных алгоритмов предметной области
Для вычитания двух стековых регистров, приводим порядок к одному значению и вычитаем мантиссы. Далее если необходимо производим нормализацию. Если в результате произошло переполнение мантиссы или порядка, устанавливаем флаги и возвращаем 0.
2.3 Построение структурной схемы программного продукта
Для работы программы необходимы следующие функции:
int main() – главная функция программы в ней вызываеться функция инициализации, заполнение стека сопроцессора, а также в диалоговом режиме вызываеться FSUB.
int fld(str reg[],_sreg &sreg,_creg creg,_twr twr,int st0 ,int stimm)– заполнение стека сопроцессора.
int print_st(str reg[],_sreg sreg,_creg creg,_twr twr, int id)– печатает 1-й элемент стека сопроцессора.
int fsub(str reg[],_sreg &sreg,_creg creg,_twr twr,int fl, int s1,int s2)– функция выполняющаяя сложение двух стековых регистров и выталкивает вершину стека.
Структурная схема программного продукта:
Рис.1. Структурная схема программного продукта
3. Описание реализации программного продукта
3.1 Описание программы эмуляции команды FSUB математического сопроцессора
В функции void main(), с которой начинается выполнение программы, производится инициализация эмулятора сопроцессора, заполнение стека первоначальными значениями, после этого предлагается в диалоговом режиме ввести значение:
1 - fsub
2 - fsub n
3 - fsub st(n), st(n)
4 - fld
0 - выход
В случае если пользователь введет 1, программа вычтет из вершины стека значение, находящееся на следующей позиции, 2 – вычтет из вершины стека переменную, введенную пользователем, 3 – произведет вычитание указанных пользователем значений стека, 4 – поместит на вершину стека новое значение.
3.2 Описание функции FSUB
Логика работы функции представлена блок-схемой на рис.3.1.
Рис.3.1. Лист 1
Рис.3.1. Лист 2
3.3 Описание функции FLD
Логика работы функции представлена блок-схемой на рис.3.2.
Рис.3.2. Лист 1
Рис.3.2. Лист 2
3.4 Описание функции Print_st
Логика работы функции представлена блок-схемой на рис.3.3.
Рис.3.3. Лист 1
4.1 Выбор стратегии тестирования и разработка тестов
Для проверки работоспособности программы необходимо разработать такой тест, чтобы он проверил все возможные случаи, которые могут возникнуть при пользовании этой программой. Для этого составим набор тестов:
План тестирования:
1. Вычтем регистры st0 и st1 командой fsub
2. Вычтем регистр st0 и переменную n командой fsub n
3. Вычтем регистры st1 и st5 командой fsub st1, st5
4. Вычтем регистры st0 и st2 командой fsub st0, st2
5. Вычтем регистры st0 и st3 командой fsub st0, st3
6. Вычтем регистры st0 и st6 командой fsub st0, st6
7. Вычтем регистры st0 и st7 командой fsub st0, st7
8. Вычтем регистры st0 и st7 командой fsub st0, st4
Результаты тестов: Перед тестированием.
twr =98B; swr =E; cwr =D
Таблица 4.1
Название регистра | Мантисса | Порядок |
St0 | 5,54 | 2 |
St1 | 4,562 | 3 |
St2 | денормализованый операнд | 0 |
St3 | 0 | 0 |
St4 | бесконечность | 0 |
St5 | 1,12 | 1 |
St6 | нечисло | 0 |
St7 | пусто | 0 |
После 1 теста ( fsub) регистры не изменяются.
Таблица 4.2
Название регистра | Мантисса | Порядок |
St0 | -4,008 | 3 |
St1 | 4,562 | 3 |
St2 | денормализованый операнд | 0 |
St3 | 0 | 0 |
St4 | бесконечность | 5 |
St5 | 1,12 | 1 |
St6 | нечисло | 0 |
St7 | пусто | 0 |
После 2 теста ( fsub n, n = -5000,52), регистры не изменяются.
Таблица 4.3
Название регистра | Мантисса | Порядок |
St0 | 9,9252 | 2 |
St1 | 4,562 | 3 |
St2 | денормализованый операнд | 0 |
St3 | 0 | 0 |
St4 | бесконечность | 5 |
St5 | 1,12 | 1 |
St6 | нечисло | 0 |
St7 | пусто | 0 |
После 3 теста ( fsub st1, st5), регистры не изменяются.
Таблица 4.4
Название регистра | Мантисса | Порядок |
St0 | 8,7952 | 2 |
St1 | 4,562 | 3 |
St2 | денормализованый операнд | 0 |
St3 | 0 | 0 |
St4 | бесконечность | 5 |
St5 | 1,12 | 1 |
St6 | нечисло | 0 |
St7 | пусто | 0 |
После 4 теста ( fsub st0, st2).
twr =98B
swr =400E (флаг IE = 1, DE = 1)
cwr =D
Таблица 4.5
Название регистра | Мантисса | Порядок |
St0 | 8,7952 | 2 |
St1 | 4,562 | 3 |
St2 | денормализованый операнд | 0 |
St3 | 0 | 0 |
St4 | бесконечность | 5 |
St5 | 1,12 | 1 |
St6 | нечисло | 0 |
St7 | пусто | 0 |
После 5 теста ( fsub st0, st3), регистры неизменны.