Эмуляция команды математического сопроцессора FSUB - Программирование, компьютеры и кибернетика курсовая работа

Эмуляция команды математического сопроцессора FSUB - Программирование, компьютеры и кибернетика курсовая работа




































Главная

Программирование, компьютеры и кибернетика
Эмуляция команды математического сопроцессора FSUB

Анализ процесса обработки информации и выбор структур данных для хранения. Методы решения задачи и разработка основных алгоритмов предметной области. Структурная схема программного продукта. Описание эмуляции команды FSUB математического сопроцессора.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

информация алгоритм эмуляция сопроцессор
1. Анализ задания и выбор технологии, языка и среды разработки
2. Определение структуры программного продукта
2.1 Анализ процесса обработки информации и выбор структур данных для хранения
2.2 Выбор методов решения задачи и разработка основных алгоритмов предметной области
2.3 Построение структурной схемы программного продукта
3. Описание реализации программного продукта
3.1 Описание программы эмуляции команды FSUB математического сопроцессора
Реалии нашего времени диктуют тот факт, что определяющим качеством товара является его стоимость. Это связано, в основном, с большим ассортиментом каждого устройства, какой бы не был необходим пользователю. Что вполне логично. Ни кто не станет покупать вещь если существует её дешевый аналог. Но ради справедливости надо заметить что не всегда качественный. Но русские не сдаются и по этому китайский ширпотреб и соответствующая ему культура деловых отношений будет существовать еще долго. Что логично это оказывает и характерное влияние на производимые электроне чипы, микроконтроллеры и прочие сопутствующие детали. Рядовой производитель столкнулся с условием максимально удешевления своей продукции с целью получения преимущества в конкурентной борьбе. И по этим причинам сейчас не редкость встретить всевозможные электронные устройства, такие как медиаплееры, телефоны и т.д. реализованные на материальной базе, лишенной многих функций как казалось обычных процессоров вычислительных систем и машин.
В основном вся тяжесть ложиться на разработчиков программного обеспечения для этих устройств. Программистам приходиться самостоятельно, опираясь на существующие функции реализовывать недостающие, если нет возможности обойтись без них.
1. Анализ задания и выбор технологии, языка и среды разработки
Для написания программы, эмулирующей работу сопроцессора необходим серьезный инструмент разработки. Так уж повелось, что в природе существует несколько способов решения поставленной задачи, тут исключения не будет. В ходе работы были просмотрены и оценены несколько языков программирования. Далее о каждом более подробно.
· Удобная среда разработки, включающая функциональный отладчик, доступный в любой момент.
· Контекстная справочная система, по которой можно изучать язык без обращения к сторонним источникам.
· Высокая скорость компиляции, высокая скорость выполнения откомпилированных программ.
· Встроенная возможность использовать вставки на языке ассемблера.
· Компилятор рассчитан на реальный режим DOS, применение которого сходит на нет. Однако в последних версиях компилятора и среды введена поддержка защищённого режима вместе с соответствующим отладчиком (TD).
· В модуле CRT имеется ошибка (некорректный подсчёт количества циклов для функции delay, не рассчитанный на быстрые процессоры, процессоры с переменной частотой и многозадачные среды), из-за которой при запуске программы на компьютерах с тактовой частотой более 200 MHz сразу происходило аварийное завершение с сообщением "Runtime error 200 at…". Существуют разные варианты исправления модуля CRT.В варианте Клауса Хартнегга ошибка 200 не возникает, но длительность Delay на быстрых компьютерах меньше желаемой, и эта проблема по незнанию иногда тоже считается недостатком Turbo Pascal.
· Язык ассеблера позволяет писать самый быстрый и компактный код, как минимум не хуже, чем генерируемый трансляторами языков более высокого уровня, всё зависит от способностей программиста.
· Если код программы достаточно большой, данные, которыми он оперирует, не помещаются целиком в регистрах процессора, т.е. частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с высокоуровневыми трансляторами по одному или нескольким параметрам: скорость работы (за счёт оптимизации вычислений и/или более рационального обращения к ОП, перераспределения данных), объём кода (в том числе за счёт эффективного использования промежуточных результатов).
· Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы с меньшими затратами ресурсов.
· При программировании на ассемблере возможен непосредственный доступ к аппаратуре, в том числе портам ввода-вывода, регистрам процессора, и др.
· Язык ассемблера применяется для создания драйверов оборудования и ядра операционной системы
· Язык ассемблера используется для создания "прошивок" BIOS.
· С помощью языка ассемблера создаются компиляторы и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ.
· Существует возможность исследования других программ с отсутствующим исходным кодом с помощью дизассемблера.
· Главное преимущество ассемблера практически полностью нивелируется хорошей оптимизацией в современных компиляторах языков высокого уровня.
· В силу своей машинной ориентации ("низкого" уровня) человеку по сравнению с языками программирования высокого уровня сложнее читать и понимать программу, она состоит из слишком "мелких" элементов -- машинных команд, соответственно усложняются программирование и отладка, растет трудоемкость, велика вероятность внесения ошибок. В значительной степени возрастает сложность совместной разработки.
· Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования.
· Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд (кроме двоично-совместимых).
· C++ -- чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. В частности:
· Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщенное программирование, метапрограммирование (шаблоны, макросы).
· Поддержка инвариантов "всегда сначала А, потом В" при помощи деструкторов. Это позволяет захватывать и особождать ресурсы, начинать и завершать операции, блокировать и разблокировать доступ к чему-либо автоматически. Например, для чтения файла достаточно объявления переменной типа ifstream. Файл будет закрыт автоматически, когда переменная перестанет быть видимой. Многие языки требуют явного написания кода в таком случае. С++ корректно обрабатывает такие ситуации и в случае возникновения исключений.
· Возможность создания обобщённых контейнеров и алгоритмов для разных типов данных, их специализация и вычисления на этапе компиляции, используя шаблоны.
· Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
· Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования -- при необходимости язык позволяет обеспечить максимальную эффективность программы.
· Имеется возможность работы на низком уровне с памятью, адресами.
· Высокая совместимость с языком С, позволяющая использовать весь существующий С-код (код С может быть с минимальными переделками скомпилирован компилятором С++; библиотеки, написанные на С, обычно могут быть вызваны из С++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на С, вызывать код, написанный на С++).
· Отчасти недостатки C++ унаследованы от языка-предка -- Си, -- и вызваны изначально заданным требованием возможно большей совместимости с Си. Это такие недостатки, как:
· Операция присваивания обозначается как = , а операция сравнения как ==. Их легко спутать, при этом операция присваивания возвращает значение, поэтому присваивание на месте выражения является синтаксически корректным, а в конструкциях цикла и ветвления появление числа на месте логического значения также допустимо, так что ошибочная конструкция оказывается синтаксически правильной. Типичный пример подобной ошибки:
· Здесь в условном операторе по ошибке написано присваивание вместо сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, а потом интерпретирует его как значение условия в операторе if. Так как нуль соответствует логическому значению "ложь" (false), блок операторов в условной конструкции не выполнится никогда. Ошибки такого рода трудно выявлять, но во многих современных компиляторах предлагается диагностика некоторых подобных конструкций.
· Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращают значение. В сочетании с обилием операций это позволяет, хотя и не обязывает, создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков C и C++ -- позволять программисту писать в любом стиле, а не навязывать "хороший" стиль.
· Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных С-библиотеках много потенциально опасных макросов.
· Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
· Необходимость записывать break в каждой ветви оператора switch и возможность последовательного выполнения нескольких ветвей при его отсутствии провоцирует ошибки из-за пропуска break. Эта же особенность позволяет делать сомнительные "трюки", базирующиеся на избирательном неприменении break и затрудняющие понимание кода.
· Препроцессор, унаследованный от С, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Scheme и Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы С/С++).
· Плохая поддержка модульности (по сути, в классическом Си модульность на уровне языка отсутствует, её обеспечение переложено на компоновщик). Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию при подключении большого количества модулей (потому что результирующий файл, который обрабатывается компилятором, оказывается очень велик). Эта схема без изменений скопирована в C++. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов Precompiled Headers.
· К собственным недостаткам C++ можно отнести:
· Сложность и избыточность, из-за которых C++ трудно изучать, а построение компилятора сопряжено с большим количеством проблем. В частности:
· В языке практически полностью сохранён набор конструкций Си, к которому добавлены новые средства. Во многих случаях новые средства и механизмы позволяют делать то же самое, что и старые, но в языке сохраняются оба варианта.
· Поддержка множественного наследования реализации в ООП-подсистеме языка вызывает целый ряд логических проблем, а также создаёт дополнительные трудности в реализации компилятора. Например, указатель на класс, имеющий несколько родителей, больше не может рассматриваться (с использованием приведения типа в стиле C) как указатель на одного из своих родителей, поскольку родительская часть объекта может быть расположена с некоторым смещением относительно начала объекта (т. е. значения указателя). По этой же причине нельзя приводить указатель на родительский класс к указателю на производный без использования специальных синтаксических средств (оператора dynamic_cast).
· Шаблоны в своём исходном виде приводят к порождению кода очень большого объёма, а введённая позже в язык возможность частичной спецификации шаблонов трудно реализуема и не поддерживается многими существующими компиляторами.
· Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Языки Lisp/Scheme, Nemerle и некоторые другие имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования.
· Хотя декларируется, что С++ мультипарадигменный язык, реально в языке отсутствует поддержка функционального программирования. Отчасти, данный пробел устраняется различными библиотеками (Loki, Boost) использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования.
· Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, в C++ имеется достаточно средств, позволяющих почти исключить использование опасных указателей, нет принципиальных проблем и в реализации и использовании сборки мусора (на уровне библиотек, а не языка). Отсутствие встроенной сборки мусора позволяет пользователю самому выбрать стратегию управления ресурсами.
Взвесив все за и против было принято решение писать на языке программирования С++. Во многом благодаря тому что данный язык является самым мощным средством разработки на данное время. Также не малую роль сыграл тот факт что самая удобная среда разработки Visual Studio также поддерживаетс С++.
2. Определение структуры программного продукта
2.1 Анализ процесса обработки информации и выбор структур данных для хранения
Процесс обработки информации приближен к процессам, проводимым в математическом сопроцессоре Intel 80x87. В программе на диалоговом уровне реализована возможность задания числового значения, которое нужно будет вычесть из вершиной стека эмулированного математического сопроцессора, и вычитание разных элементов стека. В том числе и идущих не по порядку. В процессе работы эмуляции сопроцессора часто необходимо быстрое обращение к битам отдельного числа для этого используется следующая структура bits, представленная в таблице 2.1
Структура bits объединенa в структур bait_tabс полями в таблице 2.2
Определим структуры для мантиссы и порядка:
Структура ud16 с полями в таблице 2.3
Структура ud64 с полями в таблице 2.4
Структура ud80 с полями в таблице 2.5
В самом же сопроцессоре стековые регистры имеют вид структуры str с полями, преставленной в таблице 2.6
Также в программе определены регистры состояния, тегов и контроля.
Структура regs представлена в таблице 2.7
Структура _sreg с полями в таблице 2.8
Структура _creg, включает в себя следующую структуру:
Структура _twr, включает в себя следующую структуру:
структура _twr с полями в таблице 2.12
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, программа вычтет из вершины стека значение, находящееся на следующей позиции, 2 - вычтет из вершины стека переменную, введенную пользователем, 3 - произведет вычитание указанных пользователем значений стека, 4 - поместит на вершину стека новое значение.
Логика работы функции представлена блок-схемой на рис.3.1.
Логика работы функции представлена блок-схемой на рис.3.2.
Логика работы функции представлена блок-схемой на рис.3.3.
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
Результаты тестов: Перед тестированием.
После 1 теста ( fsub) регистры не изменяются.
После 2 теста ( fsub n, n = -5000,52), регистры не изменяются.
После 3 теста ( fsub st1, st5), регистры не изменяются.
После 5 теста ( fsub st0, st3), регистры неизменны.
После 6 теста ( fsub st0, st6); twr =98B; swr =600E (флаг IE = 1)
В результате проделанной работы была написана программа, по своей сути, дублирующая команду математического сопроцессора fsub, а также её вариации. Были изучены и применены на практике в виде эмуляции 3 регистра. Регистор тегов, регистр команд и регистр состояний.
Была изучена система команд процессора 80х87 и принципы работы процессоров. Было получено представление и содержании такого устройства как процессор, что до не давнего времени было известно на уровне "черного ящика".
unsigned IE: 1; // Ошибка недействительной операции;
unsigned DE: 1; // Ошибка денормализованного операнда;
unsigned ZE: 1; // Ошибка деления на ноль;
unsigned OE: 1; // Ошибка антипереполнения;
unsigned UE: 1; // Ошибка переполнения;
unsigned PE: 1; // Ошибка точности;
unsigned SF: 1; // Бит ошибки работы со стеком;
unsigned ES: 1; // Бит суммарной ошибки;
unsigned C0: 1; // Бит признака (Condition Code);
unsigned C1: 1; // Бит признака (Condition Code);
unsigned C2: 1; // Бит признака (Condition Code);
unsigned TOP:3; // Указатель регистра текущей вершины стека;
unsigned C3: 1; // Бит признака (Condition Code);
unsigned IM: 1; // Маска недействительной операции;
unsigned DM: 1; // Маска денормализованного операнда;
unsigned ZM: 1; // Маска деления на ноль;
unsigned OM: 1; // Маска антипереполнения;
unsigned UM: 1; // Маска переполнения;
unsigned PC: 2; // Поле управления точностью;
unsigned RC: 2; // Поле управления округлением.
unsigned char pr0:2;// 00 - занят допустимым не нулевым значением
//unsigned char pr1:2;// 01 - содержит нулевое значение
//unsigned char pr2:2;// 10 - содержит специальное численное значение
//unsigned char pr3:2;// 11 - регистр пуст
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);
int fsub(str reg[],_sreg &sreg,_creg creg,_twr twr,int fl,int s1, int s2);
printf("1 - fsub\n2 - fsub n\n3 - fsub st(n), st(n)\n4 - fld\n0 - выход\n");
case 1:// fsub========================================================================================
printf("Введите непосредственный операнд: \n");
printf("Введите номера регистров, которые вы хотите использовать: \n");
printf("Добовлнение значения в стек: \n");
int fld(str reg[],_sreg &sreg,_creg creg,_twr twr,int st0 ,int stimm)
for(int m = 0; m <= strlen(l); m++)
reg[sreg.data.TOP].val.mant.val = i;
reg[sreg.data.TOP].val.exp.val = p;
int print_st(str reg[],_sreg sreg,_creg creg,_twr twr, int id)
double a = (double)reg[ssn].val.mant.val;
int fsub(str reg[],_sreg &sreg,_creg creg,_twr twr,int fl, int s1,int s2)
a = reg[sreg.data.TOP +1].val.mant.val;
am = reg[sreg.data.TOP +1].val.exp.val;
for(short n = 0; n <= (-1)*dm; n++)
reg[sreg.data.TOP +1].val.exp.val += (-1)*dm;
reg[sreg.data.TOP].val.mant.val = a;
Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и оценка структур данных для ее хранения. Разработка основных алгоритмов решения и структурной схемы программного продукта. Проектирование интерфейса пользователя. курсовая работа [449,8 K], добавлен 14.01.2011
Выбор технологии, языка и среды программирования. Анализ процесса обработки информации и выбор структур данных для ее хранения, разработка основных алгоритмов. Проектирование интерфейса пользователя. Выбор стратегии тестирования и разработка тестов. курсовая работа [332,3 K], добавлен 09.12.2014
Коды условий после сравнения. Элементарные трансцендентные функции. Формулы для вычисления тригонометрических функций. Команды управления сопроцессора х87. Формулы для вычисления показательный и гиперболических функций. Инициализация сопроцессора х87. контрольная работа [36,0 K], добавлен 01.12.2010
Основные понятия математического сопроцессора. Изучение принципа работы и функций устройства: точное деление, вычисление тригонометрических функций, извлечение квадратного корня и нахождение логарифма. Расчет себестоимости и экономической эффективности. дипломная работа [2,2 M], добавлен 15.05.2014
Модель целочисленного MMX-расширения и особенности работы сопроцессора. Отображение ММХ-регистров на регистры стека сопроцессора. Система команд MMX: команды пересылки, сложения и вычитания, сравнения, логических операций, сдвига, упаковки и распаковки. презентация [240,3 K], добавлен 11.12.2013
Обоснование необходимости разработки сайта и основные требования его функционалу. Анализ процесса обработки информации и выбор структур данных для ее хранения. Реализации программного продукта, а также принципы его настройки, тестирования и отладки. дипломная работа [4,3 M], добавлен 19.01.2017
Описание предметной области решаемой задачи. Входные документы, необходимые для решения задачи, ее функции. Разработка информационного обеспечения задачи и реквизиты входной информации. Технология и алгоритмов решения задачи и их машинная реализация. контрольная работа [15,1 K], добавлен 21.10.2010
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Эмуляция команды математического сопроцессора FSUB курсовая работа. Программирование, компьютеры и кибернетика.
Реферат: Интеллектуальные системы. Скачать бесплатно и без регистрации
Реферат На Тему Архитектура Базы Данных
КРОВЕЛЬНЫЕ РАБОТЫ
Реферат по теме Does the crime pay or not ?
Курсовая работа по теме Пристрій термоконтролю на базі мікроконтролера ATMEGA16
Какие Критерии Относятся К Реферату
Реферат по теме Москва. Кремль в историческом развитии
Контрольная работа: Адаптивная физическая культура как наука
Курсовая работа: Поняття та методи криміналістики
Реферат: Походы выходного дня
Курсовая работа по теме Методы и пути коррекции школьной тревожности
Курсовая Работа На Тему Анализ Различных Методов Оценки Статистических Показателей При Типическом Отборе
Реферат: Контрольно-советующий аудит
Контрольная работа по теме Охрана окружающей среды и рациональное использование природных ресурсов в России
Реферат На Тему Исследование Рынка Недвижимости
Курсовая работа по теме Аккумулирование данных о производственных затратах для оценки себестоимости произведенной продукции и определения прибыли
Темная Аллея Жизнь Жизнь Судьба Сочинение
Методичка На Тему Оперативная Техника
Контрольная работа: Профилактика конфликтности в подразделениях ОВД
Реферат На Тему Основные Устройства Пк
Особенности и перспективы развития спутниковой связи - Коммуникации, связь, цифровые приборы и радиоэлектроника курсовая работа
Application of digital education resources in teaching computer science - Программирование, компьютеры и кибернетика контрольная работа
Аутсорсинг бухгалтерских услуг - Бухгалтерский учет и аудит реферат


Report Page