Реферат по предмету "Информатика, программирование"


Эмуляция команды математического сопроцессора FSUB

Содержание
информация алгоритм эмуляция сопроцессор
Введение
1. Анализзадания и выбор технологии, языка и среды разработки
2. Определениеструктуры программного продукта
2.1 Анализ процесса обработкиинформации и выбор структур данных для хранения
2.2 Выбор методов решения задачи иразработка основных алгоритмов предметной области
2.3 Построение структурной схемыпрограммного продукта
3. Описаниереализации программного продукта
3.1 Описание программы эмуляциикоманды FSUB математическогосопроцессора
3.2 Описание функции FSUB
3.3 Описание функции FLD
3.4 Описаниефункции Print_st
4. Тестированиепрограммы
Заключение
Приложение

Введение
Реалиинашего времени диктуют тот факт, что определяющим качеством товара является егостоимость. Это связано, в основном, с большим ассортиментом каждого устройства,какой бы не был необходим пользователю. Что вполне логично. Ни кто не станетпокупать вещь если существует её дешевый аналог. Но ради справедливости надозаметить что не всегда качественный. Норусские не сдаются и по этому китайский ширпотреб и соответствующая емукультура деловых отношений будет существовать еще долго. Что логично этооказывает и характерное влияние на производимые электроне чипы,микроконтроллеры и прочие сопутствующие детали. Рядовой производительстолкнулся с условием максимально удешевления своей продукции с целью полученияпреимущества в конкурентной борьбе. И по этим причинам сейчас не редкостьвстретить всевозможные электронные устройства, такие как медиаплееры, телефоныи т.д. реализованные на материальной базе, лишенной многих функций как казалосьобычных процессоров вычислительных систем и машин.
Восновном вся тяжесть ложиться на разработчиков программного обеспечения дляэтих устройств. Программистам приходиться самостоятельно, опираясь насуществующие функции реализовывать недостающие, если нет возможности обойтисьбез них.

1. Анализзадания и выбор технологии, языка и среды разработки
Длянаписания программы, эмулирующей работу сопроцессора необходим серьезныйинструмент разработки. Так уж повелось, что в природе существует несколькоспособов решения поставленной задачи, тут исключения не будет. В ходе работыбыли просмотрены и оценены несколько языков программирования. Далее о каждомболее подробно.
Pascal, достоинства :
· Удобнаясреда разработки, включающая функциональный отладчик, доступный в любой момент.
· Контекстнаясправочная система, по которой можно изучать язык без обращения к стороннимисточникам.
· Высокаяскорость компиляции, высокая скорость выполнения откомпилированных программ.
· Встроеннаявозможность использовать вставки на языке ассемблера.
Недостатки:
· Компиляторрассчитан на реальный режим DOS, применение которого сходит на нет. Однако впоследних версиях компилятора и среды введена поддержка защищённого режимавместе с соответствующим отладчиком (TD).
· Вмодуле CRT имеется ошибка (некорректный подсчёт количества циклов для функцииdelay, не рассчитанный на быстрые процессоры, процессоры с переменной частотойи многозадачные среды), из-за которой при запуске программы на компьютерах стактовой частотой более 200 MHz сразу происходило аварийное завершение ссообщением «Runtime error 200 at…». Существуют разные вариантыисправления модуля CRT.В варианте Клауса Хартнегга ошибка 200 не возникает, нодлительность Delay на быстрых компьютерах меньше желаемой, и эта проблема понезнанию иногда тоже считается недостатком Turbo Pascal.
Assembler, достоинства:
· Языкассеблера позволяет писать самый быстрый и компактный код, как минимум не хуже,чем генерируемый трансляторами языков более высокого уровня, всё зависит отспособностей программиста.
· Есликод программы достаточно большой, данные, которыми он оперирует, не помещаютсяцеликом в регистрах процессора, т.е. частично или полностью находятся воперативной памяти, то искусный программист, как правило, способен значительнооптимизировать программу по сравнению с высокоуровневыми трансляторами поодному или нескольким параметрам: скорость работы (за счёт оптимизациивычислений и/или более рационального обращения к ОП, перераспределения данных),объём кода (в том числе за счёт эффективного использования промежуточныхрезультатов).
· Обеспечениемаксимального использования специфических возможностей конкретной платформы,что также позволяет создавать более эффективные программы с меньшими затратамиресурсов.
· Припрограммировании на ассемблере возможен непосредственный доступ к аппаратуре, втом числе портам ввода-вывода, регистрам процессора, и др.
· Языкассемблера применяется для создания драйверов оборудования и ядра операционнойсистемы
· Языкассемблера используется для создания «прошивок» BIOS.
· Спомощью языка ассемблера создаются компиляторы и интерпретаторы языков высокогоуровня, а также реализуется совместимость платформ.
· Существуетвозможность исследования других программ с отсутствующим исходным кодом спомощью дизассемблера.
Недостатки:
· Главноепреимущество ассемблера практически полностью нивелируется хорошей оптимизациейв современных компиляторах языков высокого уровня.
· Всилу своей машинной ориентации («низкого» уровня) человеку посравнению с языками программирования высокого уровня сложнее читать и пониматьпрограмму, она состоит из слишком «мелких» элементов — машинныхкоманд, соответственно усложняются программирование и отладка, растеттрудоемкость, велика вероятность внесения ошибок. В значительной степенивозрастает сложность совместной разработки.
· Какправило, меньшее количество доступных библиотек по сравнению с современнымииндустриальными языками программирования.
· Отсутствуетпереносимость программ на компьютеры с другой архитектурой и системой команд(кроме двоично-совместимых).
С++,достоинства:
· C++— чрезвычайно мощный язык, содержащий средства создания эффективных программпрактически любого назначения, от низкоуровневых утилит и драйверов до сложных программныхкомплексов самого различного назначения. В частности:
· Поддерживаютсяразличные стили и технологии программирования, включая традиционное директивноепрограммирование, ООП, обобщенное программирование, метапрограммирование(шаблоны, макросы).
· Поддержкаинвариантов «всегда сначала А, потом В» при помощи деструкторов. Этопозволяет захватывать и особождать ресурсы, начинать и завершать операции,блокировать и разблокировать доступ к чему-либо автоматически. Например, длячтения файла достаточно объявления переменной типа ifstream. Файл будет закрытавтоматически, когда переменная перестанет быть видимой. Многие языки требуютявного написания кода в таком случае. С++ корректно обрабатывает такие ситуациии в случае возникновения исключений.
· Возможностьсоздания обобщённых контейнеров и алгоритмов для разных типов данных, ихспециализация и вычисления на этапе компиляции, используя шаблоны.
· Кроссплатформенность.Доступны компиляторы для большого количества платформ, на языке C++разрабатывают программы для самых различных платформ и систем.
· Эффективность.Язык спроектирован так, чтобы дать программисту максимальный контроль над всемиаспектами структуры и порядка исполнения программы. Ни одна из языковыхвозможностей, приводящая к дополнительным накладным расходам, не являетсяобязательной для использования — при необходимости язык позволяет обеспечитьмаксимальную эффективность программы.
· Имеетсявозможность работы на низком уровне с памятью, адресами.
· Высокаясовместимость с языком С, позволяющая использовать весь существующий С-код (кодС может быть с минимальными переделками скомпилирован компилятором С++;библиотеки, написанные на С, обычно могут быть вызваны из С++ непосредственнобез каких-либо дополнительных затрат, в том числе и на уровне функций обратноговызова, позволяя библиотекам, написанным на С, вызывать код, написанный наС++).
Недостатки:
· Отчастинедостатки C++ унаследованы от языка-предка — Си, — и вызваны изначальнозаданным требованием возможно большей совместимости с Си. Это такие недостатки,как:
· Синтаксис,провоцирующий ошибки:
· Операцияприсваивания обозначается как =, а операция сравнения как ==. Их легкоспутать, при этом операция присваивания возвращает значение, поэтомуприсваивание на месте выражения является синтаксически корректным, а вконструкциях цикла и ветвления появление числа на месте логического значениятакже допустимо, так что ошибочная конструкция оказывается синтаксическиправильной. Типичный пример подобной ошибки:
· if(x=0) { операторы }
· Здесьв условном операторе по ошибке написано присваивание вместо сравнения. Врезультате, вместо того, чтобы сравнить текущее значение 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++ имеется достаточно средств, позволяющих почти исключитьиспользование опасных указателей, нет принципиальных проблем и в реализации ииспользовании сборки мусора (на уровне библиотек, а не языка). Отсутствиевстроенной сборки мусора позволяет пользователю самому выбрать стратегиюуправления ресурсами.
Взвесив все за и против былопринято решение писать на языке программирования С++. Во многом благодаря томучто данный язык является самым мощным средством разработки на данное время.Также не малую роль сыграл тот факт что самая удобная среда разработки VisualStudio также поддерживаетсС++.

2. Определениеструктуры программного продукта/>/>
2.1 Анализ процесса обработки информациии выбор структур данных для хранения
Процессобработки информации приближен к процессам, проводимым в математическом сопроцессореIntel 80x87.В программе на диалоговом уровне реализована возможность задания числовогозначения, которое нужно будет вычесть из вершиной стека эмулированногоматематического сопроцессора, и вычитание разных элементов стека. В том числе иидущих не по порядку. В процессе работыэмуляции сопроцессора часто необходимо быстрое обращение к битам отдельногочисла для этого используется следующая структура bits,представленная в таблице 2.1
Таблица 2.1тип имя переменной размер(бит) unsigned char b0 1 unsigned char b1 1 unsigned char b2 1 unsigned char b3 1 unsigned char b4 1 unsigned char b5 1 unsigned char b6 1 unsigned char b7 1
Структура bitsобъединенaв структур bait_tabсполями в таблице 2.2
Таблица 2.2тип название bits bit unsigned char bait

Определимструктуры для мантиссы и порядка:
/>Структураud16 с полями в таблице2.3
Таблица 2.3тип название bait_tab data[2] short val
Структура ud64с полями в таблице 2.4
Таблица 2.4 тип название bait_tab data[8] _int64 val
Структура ud80с полями в таблице 2.5
Таблица 2.5тип название ud64 mant ud16 exp
Всамом же сопроцессоре стековые регистры имеют вид/>/> структуры strс полями, преставленной в таблице 2.6
Таблица2.6типа название bait_tab data[10] ud80 val
Такжев программе определены регистры состояния, тегов и контроля.
Структура regs представлена в таблице2.7

Таблица 2.7тип имя переменной размер(бит) 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 unsigned C1 1 unsigned C2 1 unsigned TOP 3 unsigned C3 1 unsigned B 1
Структура _sregсполями в таблице 2.8
Таблица 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(strreg[],_sreg &sreg,_creg creg,_twr twr,int st0 ,int stimm)– заполнение стекасопроцессора.
int print_st(strreg[],_sreg sreg,_creg creg,_twr twr, int id)– печатает 1-й элемент стекасопроцессора.
int fsub(str reg[],_sreg &sreg,_cregcreg,_twr twr,int fl, int s1,int s2)– функция выполняющаяя сложение двухстековых регистров и выталкивает вершину стека.
Структурная схема программногопродукта:
/>
Рис.1. Структурная схемапрограммного продукта

3. Описаниереализации программного продукта
3.1Описаниепрограммы эмуляции команды FSUBматематического сопроцессора
В функции voidmain(),с которой начинается выполнение программы, производится инициализация эмуляторасопроцессора, заполнение стека первоначальными значениями, после этогопредлагается в диалоговом режиме ввести значение:
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. Тестированиепрограммы
4.1Выборстратегии тестирования и разработка тестов
Дляпроверки работоспособности программы необходимо разработать такой тест, чтобыон проверил все возможные случаи, которые могут возникнуть при пользовании этойпрограммой. Для этого составим набор тестов:
Плантестирования:
1. Вычтемрегистры st0 и st1командой fsub
2. Вычтемрегистр st0 и переменную nкомандой fsubn
3. Вычтемрегистры st1 и st5командой fsubst1, st5
4. Вычтемрегистры st0 и st2командой fsubst0, st2
5. Вычтемрегистры st0 и st3командой fsubst0, st3
6. Вычтемрегистры st0 и st6командой fsubst0, st6
7. Вычтемрегистры st0 и st7командой fsubst0, st7
8. Вычтемрегистры st0 и st7командой fsubst0, st4
Результаты тестов:Передтестированием.
twr =98B;swr =E; cwr=D
Таблица 4.1Название регистра Мантисса Порядок St0 5,54 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность St5 1,12 1 St6 нечисло St7 пусто

После 1 теста ( fsub)регистры не изменяются.
Таблица 4.2Название регистра Мантисса Порядок St0 -4,008 3 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
После 2 теста (fsub n,n = -5000,52), регистры неизменяются.
Таблица 4.3Название регистра Мантисса Порядок St0 9,9252 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
После 3 теста (fsub st1,st5), регистры не изменяются.
Таблица 4.4Название регистра Мантисса Порядок St0 8,7952 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
 
После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 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
После 5 теста (fsub st0,st3), регистры неизменны.
Таблица 4.6Название регистра Мантисса Порядок St0 8,7952 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
После6 теста( fsub st0, st6);twr =98B; swr=600E (флагIE = 1)
cwr =D

Таблица 4.7Название регистра Мантисса Порядок St0 8,7952 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
После7 теста( fsub st0, st7).
twr =98B
swr =410E (флагIE = 1, SF = 1)
cwr =D
Таблица 4.8Название регистра Мантисса Порядок St0 8,7952 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто
После8 теста( fsub st0, st4).
twr =98B
swr =600E (флагIE = 1)
cwr =D

Таблица 4.9Название регистра Мантисса Порядок St0 8,7952 2 St1 4,562 3 St2 денормализованый операнд St3 St4 бесконечность 5 St5 1,12 1 St6 нечисло St7 пусто

Заключение
В результате проделанной работыбыла написана программа, по своей сути, дублирующая команду математическогосопроцессора fsub, а также её вариации.Были изучены и применены на практике в виде эмуляции 3 регистра. Регистортегов, регистр команд и регистр состояний.
Была изучена система командпроцессора 80х87 и принципы работы процессоров. Было полученопредставление и содержании такого устройства как процессор, что до не давнеговремени было известно на уровне «черного ящика».

Приложение
П.1. Текст программы
#include
#include
#include
struct bits
{
unsigned char b0: 1;
unsigned char b1: 1;
unsigned char b2: 1;
unsigned char b3: 1;
unsigned char b4: 1;
unsigned char b5: 1;
unsigned char b6: 1;
unsigned char b7: 1;
};
union bait_tab
{
bits bit;
unsigned char bait;
};
struct regs
{
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 B: 1; // Битзанятости.
};
union _sreg
{
regs data;
unsigned short int sreg;
};
union _creg
{
struct
{
//маски
unsigned IM: 1; // Масканедействительнойоперации;
unsigned DM: 1; // Маскаденормализованного операнда;
unsigned ZM: 1; // Маска деления наноль;
unsigned OM: 1; // Маскаантипереполнения;
unsigned UM: 1; // Маска переполнения;
unsigned PM: 1; // Маска точности;
unsigned PC: 2; // Поле управленияточностью;
unsigned RC: 2; // Поле управленияокруглением.
} data;
unsigned short int creg;
};
union _twr
{
struct
{
unsigned char pr0:2;// 00 — занятдопустимымненулевымзначением
//unsigned char pr1:2;// 01 — содержитнулевое значение
//unsigned char pr2:2;// 10 — содержитспециальное численное значение
//unsigned char pr3:2;// 11 — регистрпуст
//unsigned char pr4:2;
//unsigned char pr5:2;
//unsigned char pr6:2;
//unsigned char pr7:2;
} data[8];
unsigned short int twr;
};
union ud16
{
bait_tab data[2];
short val;
};
union ud32
{
bait_tab data[4];
 int val;
};
union ud64
{
bait_tab data[8];
 _int64 val;
};
struct ud80
{
ud64 mant;
ud16 exp;
};
union str
{
bait_tab data[10];
ud80 val;
};
int fld(str reg[],_sreg&sreg,_creg creg,_twr twr,int st0 ,int stimm);
int print_st(str reg[],_sregsreg,_creg creg,_twr twr,int id);
int fsub(str reg[],_sreg&sreg,_creg creg,_twr twr,int fl,int s1, int s2);
int main()
{
str reg[9]={};
_sreg sreg;
_creg creg;
_twr twr;
setlocale(LC_ALL,«Russian»);
int d = -1;
sreg.sreg = 0;
creg.creg = 0;
sreg.data.TOP = 7;
creg.data.PC = 3;
twr.twr = 0xffff;
memset(reg,0,sizeof(reg));
while(d != 0)
{
printf(«1 — fsub\n2 — fsubn\n3 — fsub st(n), st(n)\n4 — fld\n0 — выход\n»);
scanf("%d",&d);
switch (d)
{
case 1://fsub========================================================================================
fsub(reg,sreg,creg,twr,1,0,0);
//print_st(reg,sreg,creg,twr,0);
break;
case 2:
printf(«Введите непосредственныйоперанд: \n»);
fld(reg,sreg,creg,twr,0,9);
print_st(reg,sreg,creg,twr,0);
break;
case 3:
int s1;
int s2;
printf(«Введите номера регистров,которые вы хотите использовать: \n»);
scanf("%d%d",&s1,&s2);
//fld(reg,sreg,creg,twr,s1,0);
//fld(reg,sreg,creg,twr,s2,0);
fsub(reg,sreg,creg,twr,1,s1,s2);
break;
case 4:
printf(«Добовлнение значения встек: \n»);
fld(reg,sreg,creg,twr,0,0);
break;
}
}
}
int fld(str reg[],_sreg&sreg,_creg creg,_twr twr,int st0 ,int stimm)
{
short p = 0;
char l[10];
_int64 i = 0;
scanf("%s",&l);
for(int m = 0; m
{
if ((l[m] == '0')&&(p
{
p--;
}
else
{
if ((i == 0)&&(l[m] !=','))p++;
}
if (l[m] == ',')
{
for(int e = m; e
{
l[e] = l[e+1];
}
char* ends;
i = strtol(l,&ends,10);
if (l[m] != '0')break;
}
}
/*if (p > 0)
{p++;}
else
{p--;}*/
if (i != 0)
{
twr.data[st0].pr0 &= 0;
}
else
{twr.data[st0].pr0 |= 1;}
p--;
if (stimm == 0)
{
if (st0 != 0)
{
reg[st0].val.mant.val = i;
reg[st0].val.exp.val = p;
}
else
{
reg[sreg.data.TOP].val.mant.val =i;
reg[sreg.data.TOP].val.exp.val = p;
sreg.data.TOP =sreg.data.TOP — 1;
}
}
else
{
reg[8].val.mant.val = i;
reg[8].val.exp.val = p;
fsub(reg,sreg,creg,twr,2,0,0);
}
return 0;
}
int print_st(str reg[],_sregsreg,_creg creg,_twr twr, int id)
{
int ssn;
if (id != 0)
{
ssn = id;
}
else
{
ssn = sreg.data.TOP;
}
double a =(double)reg[ssn].val.mant.val;
short b = reg[ssn].val.exp.val;
for (int i = 0; i
{
a /=10;
}
printf("%10.5f\n",a);
return 0;
}
int fsub(str reg[],_sreg&sreg,_creg creg,_twr twr,int fl, int s1,int s2)
{
_int64 a;
short am;
_int64 b;
short bm;
int sn1;
int sn2;
if (fl == 1)
{
if ((s2 == 0)&&(s1 == 0))
{
//sn1 = sreg.data.TOP + 2;
//sn2 = sreg.data.TOP + 1 ;
sn1 = 7;
sn2 = 6;
}
else
{
sn1 = sreg.data.TOP + s1;
sn2 = sreg.data.TOP + s2;
}
 a = reg[sn1].val.mant.val;
 am = reg[sn1].val.exp.val;
 b = reg[sn2].val.mant.val;
 bm = reg[sn2].val.exp.val;
}
else
{
a = reg[sreg.data.TOP+1].val.mant.val;
am = reg[sreg.data.TOP+1].val.exp.val;
b = reg[8].val.mant.val;
bm = reg[8].val.exp.val;
}
short dm = am — bm;
if (a > b)
{
for(int i = 0; i
{
a *= 10;
}
//reg[sn1].val.exp.val+=dm;
}
else
{
for(short n = 0; n
{
b *= 10;
}
if (fl == 1)
{
reg[sn1].val.exp.val += (-1)*dm;
}
else
{
reg[sreg.data.TOP +1].val.exp.val+= (-1)*dm;
}
}
a-= b;
//printf("%d\n",a);
if (fl == 1)
{
reg[sn1].val.mant.val = a;
//sreg.data.TOP+=2;
print_st(reg,sreg,creg,twr,sn1);
}
else
{
reg[sreg.data.TOP].val.mant.val =a;
//sreg.data.TOP+=1;
}
return 0;
}


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.