Курсовая работа: Ассемблер. Реферат ассемблер


Реферат - Ассемблер - Информатика, программирование

МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

ПОЯСНИТЕЛЬНАЯЗАПИСКА К КУРСОВОЙ РАБОТЕ

по дисциплине:

«Системное программирование»

 

 

 

Выполнил:Тябенков А.О.

студентIV курса МГОУ

Специальность:200106

Шифр:6041013/ с

Проверил:Юрагов Е.А.

2008

МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ  УНИВЕРИТЕТ

Факультетинформатики и радиоэлектроники

Кафедра:Информационная измерительная техника

Специальность:200106

ЗАДАНИЕ

Накурсовой проект  Тябенкова Антона Олеговича        Шифр: 6041013/с

1. Тема работы:

 На языкеассемблера разработать алгоритм контроля, на циклический CRC-код, массиваданных хранящегося в некоторой  области памяти. Код должен быть сохранен дляпоследующей  периодической проверки массива данных. В случае несовпадения  наэкран должно выводиться сообщение об искажении данных.

2. Содержаниепояснительной записки:

Введение

1. Созданиепрограммы на ассемблере

2. Синтаксисассемблера

3. Описаниеалгоритма

4. Описаниепрограммы

Заключение

Список литературы

3.Дата выдачи задания:

4.Срок выполнения:

Заданиевыдал     _______________Юрагов Е.А.

Заданиепринял   _______________Тябенков А.О.

СОДЕРЖАНИЕ

Введение--------------------------------------------------------------------------------- 2

1. Создание программы на ассемблере---------------------------------------- 6

2. Синтаксис ассемблера------------------------------------------------------------ 12

3. Описание алгоритма-------------------------------------------------------------- 17

4. Описание программы------------------------------------------------------------ 19

Приложение 1 Блок-схема алгоритма — 20

Приложение 2 Листинг программы--------------------------------------------- 21

Заключение----------------------------------------------------------------------------- 26

Список литературы------------------------------------------------------------------- 27

ВВЕДЕНИЕ

 

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

В то же время,внося в микропроцессор принципиальные изменения, разработчики были вы­нужденыпостоянно иметь в виду необходимость обеспечения совмести­мости новых моделейсо старыми, чтобы не отпугивать потенциального покупателя перспективой полнойзамены освоенного или разработанно­го им программного обеспечения. В результатесовременные микропро­цессоры типа Pentium, обеспечивая такие возможности, как32-битную адресацию почти неограниченных объемов памяти, многозадачный ре­жим содновременным выполнением нескольких программ, аппаратные средства защитыоперационной системы и прикладных программ друг от друга, богатый набордополнительных эффективных команд и способов адресации, в то же время могутработать (и часто работают) в режиме первых микропроцессоров типа 8086, используявсего лишь 1 мегабайт оперативной памяти, 16-разрядные операнды (т. е. числа вдиапазоне до 216-1=65535) и ограниченный состав команд. Посколькупрограммирова­ние на языке ассемблера напрямую затрагивает аппаратныевозможности микропроцессора, прежде всего, следует выяснить, в какой степенипро­граммист может использовать новые возможности микропроцессоров в своихпрограммах, и какие проблемы программной несовместимости мо­гут при этомвозникнуть.

Первыеперсональные компьютеры корпорации IBM, появившиеся в 1981 г. и получившиеназвание IBM PC, использовали в качестве цент­рального вычислительного узла16-разрядный микропроцессор с 8-раз­рядной внешней шиной Intel 8088. Вдальнейшем в персональных компью­терах стал использоваться и другой вариантмикропроцессора, 8086, ко­торый отличался от 8088 тем, что являлся полностью16-разрядным. С тех пор его имя стало нарицательным, и в программах,использующих только возможности процессоров 8088 или 8086, говорят, что ониработают в режиме 86-го процессора.

В 1983 г.корпорацией Intel был предложен микропроцессор 80286, в котором был реализованпринципиально новый режим работы, получив­ший название защищенного. Однакопроцессор 80286 мог работать и в режиме 86-го процессора, который сталиназывать реальным.

В дальнейшем насмену процессору 80286 пришли модели 80386, i486 и, наконец, различные вариантыпроцессора Pentium. Все они могут ра­ботать и в реальном, и в защищенномрежимах. Хотя каждая следующая модель была значительно совершеннее предыдущей(в частности, почти на два порядка возросла скорость работы процессора, начинаяс модели 80386 процессор стал 32-разрядным, а в процессорах Pentium реализовандаже 64-разрядный обмен данными с системной шиной), однако с точки зренияпрограммиста все эти процессоры весьма схожи. Основным их ка­чеством являетсяналичие двух режимов работы — реального и защищен­ного. Строго говоря, всовременных процессорах реализован еще и третий режим — виртуального 86-гопроцессора, или V86, однако в плане ис­пользования языка ассемблера этот режимне отличается от обычного режима 86-го процессора, и в этой книге мы егокасаться не будем.

Реальный изащищенный режимы прежде всего принципиально раз­личаются способом обращения коперативной памяти компьютера. Метод адресации памяти, используемый в реальномрежиме, позволяет адресо­вать память лишь в пределах 1 Мбайт; в защищенномрежиме использует­ся другой механизм (из-за чего, в частности, эти режимы иоказались полностью несовместимыми), позволяющий обращаться к памяти объе­момдо 4 Гбайт. Другое важное отличие защищенного режима заключается в аппаратнойподдержке многозадачности с аппаратной же (т.е. реализо­ванной в самоммикропроцессоре) защитой задач друг от друга.

Реальный изащищенный режимы имеют прямое отношение к работе операционной системы,установленной на компьютере.

В настоящее времяна персональных компьютерах типа IBM PC ис­пользуются в основном два классаоперационных систем (оба — разработ­ки корпорации Microsoft): однозадачнаятекстовая система MS-DOS и многозадачная графическая система Windows.Операционная система MS-DOS является системой реального режима; другимисловами, она исполь­зует только средства процессора 8086, даже если онаустановлена на ком­пьютере с процессором Pentium. Система Windows — это системазащи­щенного режима; она значительно более полно использует возможностисовременных процессоров, в частности, многозадачность и расширенное адресноепространство. Разумеется, система Windows не могла бы рабо­тать с процессором8086, так как в нем не был реализован защищенный режим.

Соответственнодвум типам операционных систем, и все программ­ное обеспечение персональныхкомпьютеров подразделяется на два клас­са: программы, предназначенные дляработы под управлением MS-DOS (их часто называют приложениями DOS) и программы,предназначен­ные для системы Windows (приложения Windows). Естественно, приложе­ния.DOS могут работать только в реальном режиме, а приложения Windows — только взащищенном.

Таким образом,выражения «программирование в системе MS-DOS», «программирование в реальномрежиме» и «программирование 86-го про­цессора» фактически являются синонимами.При этом следует подчерк­нуть, что хотя процессор 8086, как микросхема, ужедавно не используется, его архитектура и система команд целиком вошли всовременные про­цессоры. Лишь относительно небольшое число команд современных процессоровспециально предназначены для организации защищенного режима и распознаютсяпроцессором, только когда он работает в защи­щенном режиме.

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

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

1.        СОЗДАНИЕ ПРОГРАММЫ НА АССЕМБЛЕРЕ.

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

В большинствеслучаев рекомендуется  следую­щий процесс разработки программы на ассемблере:

1.Этап постановкии формулировки задачи:

·       изучение предметной области и сбор материала впроблемно-ориентиро­ванном контексте;

·       определение назначения программы, выработка требований к нейи пред­ставление требований, если возможно, в формализованном виде;

·       формулирование требований к представлению исходных данных ивы­ходных результатов;

·       определение структур входных и выходных данных;

·       формирование ограничений и допущений на исходные и выходныедан­ные.

2.Этаппроектирования:

·       формирование «ассемблерной» модели задачи;

·       выбор метода реализации задачи;

·       разработка алгоритма реализации задачи;

·       разработка структуры программы в соответствии с выбранноймоделью памяти.

3. Этап кодирования:

·       уточнение структуры входных и выходных данных и определениеассемб­лерного формата их представления;

·       программирование задачи;

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

4.   Этап отладкии тестирования:

·       составление тестов для проверки правильности работыпрограммы;

·       обнаружение, локализация и устранение ошибок в программе,выявлен­ных в тестах;

·       корректировка кода программы и ее описания.

5.   Этапэксплуатации и сопровождения:

·       настройка программы на конкретные условия использования;

·       обучение пользователей работе с программой;

·       организация сбора сведений о сбоях в работе программы,ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства рабеты с программой;

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

К порядкуприменения и полноте выполнения перечисленных этапов нужно подходить разумно.Многое определяется особенностями конкретной задачи, ее назначением, объемомкода и обрабатываемых данных, другими характеристиками задачи. Некоторые изэтих этапов могут либо выполняться одновременно с другими этапами, либо вовсеотсутствовать.

Традиционно усуществующих реализаций ассемблера нет интегрированной среды, подобнойинтегрированным средам Turbo Pascal, Turbo С или Visual C++. Поэтому длявыполнения всех функций по вводу кода программы, ее трансляции, редактированиюи отладке необходимо использовать отдельные служебные программы. Большая частьих входит в состав специализированных пакетов ассемблера.

На рисунке одинприведена общая схема процесса разработки программы на ассемблере. На схемевыделено четыре шага процесса. На первом шаге, когда вводится код программы,можно использовать любой текстовый редактор. Основным требованием к немуявляется то, чтобы он не вставлял посторонних символов (спецсимволовредактирова­нии). Файл должен иметь расширение. asm.

/>

Рис. 1. «Процессразработки программы на ассемблере».

Программы,реализующие остальные шаги схемы, входят в состав программного пакетаассемблера. После написания текста программы на ассемблере наступает следующийэтап — трансляция программы. На этом шаге формируется объектный модуль, которыйвключает в себя представление исходной програм­мы в машинных кодах и некоторуюдругую информацию, необходимую для отладки и компоновки его с другими модулями.Традиционно на рынке ассемблеров для микропроцессоров фирмы Intel имеется двапакета: «Макроассемблер» MASM фирмы Microsoft и Turbo Assembler TASM фирмыBorland.

У этих пакетовмного общего. Пакет макроассемблера фирмы Microsoft (MASM) получил своеназвание потому, что он позволял программисту зада­вать макроопределения (илимакросы), представляющие собой именованные группы команд. Они обладали темсвойством, что их можно было вставлять в программу в любом месте, указав толькоимя группы в месте вставки. Пакет Turbo Assembler (TASM) интересен тем, чтоимеет два режима работы. Один из этих режимов, называемый MASM, поддерживаетвсе основные возможнос­ти макроассемблера MASM. Другой режим, называемый IDEAL,предоставляет более удобный синтаксис написания программ, более эффективноеиспользова­ние памяти при трансляции программы и другие новшества, приближающиекомпилятор ассемблера к компиляторам языков высокого уровня.

В эти пакетывходят трансляторы, компоновщики, отладчики и другие утили­ты для повышенияэффективности процесса разработки программ на ассембле­ре.

В данной курсовойработе для получения объектного модуля исходный файл подвергается трансляциипри помощи про­граммы tasm.exe из пакета TASM.

После устраненияошибок можно приступать к следующему шагу — созданию исполняемого(загрузочного) модуля, или, как еще называют этот процесс, к компоновкепрограммы. Главная цель этого шага — преобразовать код и данные в объектныхфайлах в их перемещаемое выполняемое отображение. Процесс создания исполняемогомодуля разделяют на 2 шага — трансляцию и компоновку. Это сделано намеренно длятого, чтобы можно было объединять вместе несколько модулей (написанных на одномили нескольких языках). Формат объектного файла позволяет, при определенныхусловиях, объединить несколько отдельно оттранслированных исходных модулей водин модуль. При этом в функции компоновщика входит разрешение внешних ссылок(ссылок на процедуры и переменные) в этих модулях. Резуль­татом работыкомпоновщика является создание загрузочного файла с расширением ехе. Послеэтого операционная система может загрузить такой файл  и выполнить его.

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

На этапе отладки,используя описание алгоритма, выполняется контроль правильностифункционирования как отдельных участков кода, так и всей программы в целом. Нодаже успешное окончание отладки еще не является гарантией того, что программабудет работать правильно со всеми возможными исходными данными. Поэтому нужнообязательно провести тестирование программы, то есть проверить ее работу на«пограничных» и заведомо некорректных исходных данных. Для этого составляютсятесты.

Специфика программна ассемблере состоит в том, что они интенсивно работают с аппаратнымиресурсами компьютера. Это обстоятельство заставляет программиста постоянноотслеживать содержимое определенных регистров и областей памяти. Естественно,что человеку трудно следить за этой информацией с большой степенью детализации.Поэтому для локализации логических ошибок в программах используют специальныйтип программного обеспечения — программные отладчики.

Отладчики бываютдвух типов:

·       интегрированные — отладчик реализован в виде интегрированнойсреды типа среды для языков Turbo Pascal, Quick С и т.д.;

·       автономные — отладчик представляет собой отдельную программу.

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

2.СИНТАКСИС АССЕМБЛЕРА

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

Предложенияассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка имеющие смысл длятранслятора. Лексемами являются:

·         идентификаторы — последовательности допустимых символов,использующиеся для обозначения таких объектов программы, как коды операций,имена переменных и названия меток. Правило записи идентификаторов заключается вследующем. Идентификатор может состоять из одного или нескольких символов. Вкачестве символов можно использовать буквы латинского алфавита, цифры инекоторые специальные знаки — _, ?, $, @.

·         цепочки символов — последовательности символов, заключенные водинарные или двойные кавычки;

·         целые числа в одной из следующих систем счисления: двоичной,десятичной, шестнадцатеричной. Отождествление чисел при записи их в программахна ассемблере производится по определенным правилам. Десятичные числа нетребуют для своего отождествления указания каких-либо дополнительных символов.

Практически каждоепредложение содержит описание объекта, над которым или при помощи котороговыполняется некоторое действие. Эти объекты называются операндами. Их можноопределить так: операнды — это объекты (некоторые значения, регистры или ячейкипамяти), на которые действуют инструкции или директивы, либо это объекты,которые определяют или уточняют действие инструкций или директив.

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

Рассмотримклассификацию операндов, поддерживаемых транслятором ассемблера.

Постоянныеили непосредственные операнды —число, строка, имя или вы­ражение, имеющие некоторое фиксированное значение.Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программыв па­мять.

Адресныеоперанды — задают физическое расположениеоперанда в памяти с помощью указания двух составляющих адреса: сегмента исмещений (рис. 2).

/>

Рис. 2. «Синтаксисописания адресных операндов».

Перемещаемыеоперанды — любые символьные имена,представляющие некоторые адреса памяти. Эти адреса могут обозначатьместоположение в памяти некоторой инструкции (если операнд — метка) или данных(если опе­ранд — имя области памяти в сегменте данных). Перемещаемые операндыотличаются от адресных тем, что они не привязаны к конкретному адресуфизической памяти. Сегментная составляющая адреса перемещаемого операнданеизвестна и будет определена после загрузки программы в память для выполнения.

Считчикадреса — специфический вид операнда. Онобозначается знаком $. Специфика этого  операнда в том, что когда трансляторассемблера встречает в  исходной программе этот символ, то он подставляетвместо него текущее значение  счетчика адреса. Значение счетчика адреса, иликак его иногда называют  счетчика размещения, представляет собой смещениетекущей ма­шинной команды относительно начала сегмента кода.

Базовыйи индексный операнды. Этот тип операндовиспользуется для реали­зации косвенной базовой, косвенной индексной адресацииили их комбина­ций и расширений.

Операнды являютсяэлементарными компонентами, из которых формируется часть машинной команды,обозначающая объекты, над которыми выполняется операция. В более общем случаеоперанды могут входить как составные части в более сложные образования,называемые выражениями. Выражения представляют собой комбинации операндов иоператоров, рассматриваемые как единое целое. Результатом вычисления выраженияможет быть адрес некоторой ячейки памяти или некоторое константное (абсолютное)значение. В табл. 2.2 приведены поддерживаемые языком ассемблера операторы иперечислены их приоритеты.

Арифметическиеоператоры. К ним относятся унарные операторы«+» и «-», бинарные «+» и «-», операторы умножения «*», целочисленного деления«/», получения остатка от деления «mod». Эти операторы расположены на уровняхприоритета 6, 7, 8 в табл. 2.1.

Операторысдвига выполняют сдвиг выражения науказанное количество раз­рядов.

Операторысравнения (возвращают значение «истина» или«ложь») предназначены для формирования логических выражений (табл. 5.1). IЛогическое значение «истина» соответствует цифровой единице, а «ложь» —  нулю.

Табл. 2.1.

Операторы сравнения

Оператор Значение eq ИСТИНА, если выражение_1 равно выражение_2 пе ИСТИНА, если выражение_1 не равно выражение_2 It ИСТИНА, если выражение_1 меньше выражение_2 le ИСТИНА, если выражение_1 меньше или равно выражение_2 gt ИСТИНА, если выражение_1 больше выражение_2 ge ИСТИНА, если выражение_1 больше или равно выражение_2 eq ИСТИНА, если выражение_1 равно выражение_2 пе ИСТИНА, если выражение_1 не равно выражение_2

Логическиеоператоры выполняют над выражениямипобитовые операции. Выражения должны быть абсолютными, то есть такими,численное значение которых может быть вычислено транслятором.

Индексныйоператор [ ]. Скобки тоже являютсяоператором, и транслятор их наличие воспринимает, как указание сложить значе­ниевыражение_1 за этими скобками с выражение_2, заключенным в скобки.

Операторпереопределения типа ptr  применяется дляпереопределения или уточнения  имя типа метки или переменной, определяемыхвыражением. Тип может принимать одно из следующих значений: byte, word, dword,qword, tbyte, noar, far. Оператор ptr позволяет непосредственно в командепереопределить тип и выполнить команду.

Операторпереопределения сегмента  :   (двоеточие)заставляет вычислять физический адрес относительно конкретно задаваемойсегментной составляющей: «имя сегментного регистра», «имя сегмента» изсоответствующей директивы SEGMENT или «имя группы».

Операторименования типа структуры. (точка) также заставляет транслятор производитьопределенные вычисления

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

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

3. ОПИСАНИЕАЛГОРИТМА

Алгоритм реализуетвычисление CRC8 делением заданного массива данных на образующий полином x8+x5+x4+1. Деление выполнено последовательным вычитанием по модулю 2полинома из исходной последовательности.

Для этогоорганизован цикл по словам исходной последовательности и цикл по разрядногосдвига внутри слова. Поскольку удобнее просматривать массив в порядкеувеличения адреса (от младшего к старшему), процедура реализует зеркальныйалгоритм.

Подробнее о томкак выполняется деление при вычислении CRC смотри в прилагаемыхисточниках.

Для процедурывычисления исходные данные передаются через регистры. Сегментный регистр ES должен содержатьсегмент в котором расположен массив, регистр DX – смещение начала массива внутри сегмента, BX – длина массива.Результат накапливается в аккумуляторе AL.

Перед началомвычислений инициируем AX значением FFFFh. В регистр CX заносим длину массива и умножаем её на 8. Таким образом этотрегистр хранит количество разрядов в массиве и используется как счётчик цикловкомандой loop. Дополнять исходную последовательность (проверяемый массив)нулями нет необходимости, т.к. количество разрядов кратно степени образующегомногочлена.

Смещение переносимв регистр DI.

В BX заносим первое словомассива.

Проверяем младшийразряд BX. Если он равен нулю – выполняем сдвиг слова на один разрядвправо,  если нет – выполняем сложение с образующим многочленом по модулю 2, азатем выполняем сдвиг.

Сдвиг по разрядамвыполняется следующим образом. В DX хранится количество сдвигов оставшееся до конца слова(удобнее подсчитывать не количество выполненных сдвигов, а от количестваразрядов в слове до 0). Если в DX – 0, то нужно в DX записать 8, а в BX загрузить следующее слово массива, иначе – просто сдвигаем BX вправо на разряд и уменьшаем DX на 1.

Повторяемсуммирование.

После окончанияпроцедуры аккумулятор AX содержит вычисленное для массива значение CRC8.

Для сохранениярезультата его переносим в переменную result.

Для проверкицелостности массива нужно повторить вычисление контрольной суммы и сравнить созначением в result.

Блок-схемаалгоритма приведена  в приложении 1.

4. ОПИСАНИЕПРОГРАММЫ

Алгоритмопределения CRC реализован в процедуре CalcCRC. Перед вызовом этойпроцедуры необходимо в регистры записать начальные данные — сегментный регистр ES должен содержатьсегмент в котором расположен массив, регистр DX – смещение начала массива внутри сегмента, BX – длина массива.

Программа выполняет следующие операции по выбору пользователя: вычисление CRC массива и записьрезультата в переменную, проверка целостности массива – повторное вычисление CRC и сравнениевычисленного значения с записанным, искажение массива – обратимое изменениеодного бита проверочного массива.

Для вычисления CRC, вызывается процедура CalcCRC, а результатвыполнения сохраняется в переменной result.

При проверкецелостности, вызывается процедура CalcCRC, а результат выполнения сравнивается с сохранённым в переменнойresult. В случае несовпадения, выводится сообщение об ошибке. Присовпадении значений (целостность данных не нарушена) сообщение не выводится ипользователь возвращается в главное меню.

Искажение массиваиспользуется для тестирования программы и демонстрации работы.

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

ПРИЛОЖЕНИЕ  1

Блок-схемаалгоритма

/>

ПРИЛОЖЕНИЕ  2

MODEL SMALL

;*****************************************************************************

;     Сегмент стека

;*****************************************************************************

_Stack      SEGMENT     WORD  'STACK'    

      DB    200h  DUP (?)

_Stack      ENDS

;*****************************************************************************

;     Сегмент тестового массива

;*****************************************************************************

DataSeg     SEGMENT     WORD 'DATA'

TestTab     DB    32 DUP (    \

                  00h, 01h, 02h, 03h, 04h, 05h, 06h,07h, \

                  08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh,0Fh,  \

                  00h, 01h, 02h, 03h, 04h, 05h, 06h,07h, \

                  08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh   \

                  )

DataSeg     ENDS

;*****************************************************************************

;     Сегмент переменных

;*****************************************************************************

_Data SEGMENT     WORD 'DATA'

;*****************************************************************************

FSelMsg     DB    13,10,'Выберите действие:',13,10, \

            13,10,'1-Определить CRC',13,10,          \

            '2-Проверить массив',13,10,        \

            '3-Исказить массив',13,10,         \

            '4-Выход',13,10,        \

            '$'

ByeStr      DB    13,10,'Для продолжения нажмите любую клавишу.$'

ErrorString DB 13,10,'Ошибка ввода',13,10,'$'

ErrorResult DB 13,10,'Данные искажены. CRC8 нарушена.',13,10,'$'

;*****************************************************************************

BegSeg      DW    (?)  ; Сегмент проверочного массива

BegOffs     DW    (?)  ; Начало проверочного массива

Result      DW    (?)  ; Результат вычисления

FuncNum     DB    (?)  ; Выбранная операция

_Data ENDS

;*****************************************************************************

;     Сегмент программы

;*****************************************************************************

      .CODE

;*****************************************************************************

      call  cls              ; Очистка экрана

      call  SetDATSeg        ; Загрузка адреса сегмента переменных

      call  SetArrSeg              ; Установка указателя сегмента массива

     ; Главное меню

Mnu:        call  SelectFunction         ; Выбор операции

      call  cls              ; Очистка экрана

      mov   AL,FuncNum

      ;*******************************

Mnu1: cmp   AL,1             ; Определение чётности

      jne   Mnu2

     ; Установка параметров

      mov   DX,OFFSET TestTab; Смещение начала массива

      mov   BX,30            ; Размер проверяемого блока данных

      ;call TestOdd

      call  CalcCRC

      mov   Result,AX        ; Сохранение результата

      ;*******************************

Mnu2: cmp   AL,2             ; Определить чётность и сравнить с пред.

      jne   Mnu3

      mov   DX,OFFSET TestTab; Смещение начала массива

      mov   BX,30            ; Размер блока данных

      call  CalcCRC

      cmp   Result,AX

      je    Mnu2End

     ; Результат не совпал. Данные искажены. Выдать сообщение об ошибке

      mov   DX,OFFSET ErrorResult

      mov   AH,9h

      int   21h              ; Вывод сообщения обошибке

      mov   DX,OFFSET ByeStr ; Вывод приглашения

      mov   AH,9h

      int   21h

      mov   AH,0Ch     

      mov   AL,01h     

      int   21h              ; Ожидание нажатия любойклавиши

Mnu2End:

      call  cls

      jmp   Mnu

      ;*******************************

Mnu3: cmp   AL,3             ; Искажение масива (первый байт)

      jne   Mnu4

      mov   DI,OFFSET TestTab

      mov   AX,ES:[DI]

      xor   AX,1                   ; Инвертируем младшийбит

      mov   ES:[DI],AX

      ;*******************************

Mnu4: cmp   AL,4             ; Выход из программы

      jne   Mnu

      ;*******************************

      jmp   Exit

     ; Завершение программы

;Exit:

     ; Приостанов перед выходом

      mov   DX,OFFSET ByeStr  ;? Нажмите клавишу??

      mov   AH,9h

      int   21h

      mov   AH,0Ch     

      mov   AL,01h     

      int   21h  

Exit:; Выход

      mov   AH,4Ch

      int   21h

;*****************************************************************************

; Печать новой строки

NewStr:          

      mov   AH,02h

      mov   DL,0Dh

      int   21h

      mov   DL,0Ah

      int   21h

      ret

;*****************************************************************************

      include     cls.prc

;*****************************************************************************

; Главное меню

SelectFunction:

      ;1.1.Вывод строки меню

      mov   DX,OFFSET FSelMsg

      mov   AH,9h

      int   21h

      ;1.2.Выбор функции

      mov   FuncNum,0

      call  input10                ; Считываемномер пункта меню

      mov   FuncNum,AL       ; Сохраняем номер выбранной функции

ExitSF:     ret

;*****************************************************************************

; Подпрограмма ввода числа

input10:

      push  BX               ; Сохраняем регистры

      push  DX

      push  CX

      mov   DX,0             ; Обнуляем регистр хранения результата

InputChar:

      clc

      mov   AH,0Ch

      mov   AL,1

      int   21h              ; Считываем символ с эхом

      cmp   AL,13d

      je    ExitI10                ; Если его код 13? конец ввода

      cmp   AL,'0'

      jb    ErrInput         ; Если код меньше кода символа 0  ошибкаввода

      cmp   AL,'9'

      jg    ErrInput         ; Если код больше кода символа 9  ошибкаввода

      clc

      sub   AX,30h                 ; Получаем из кода символа число

      mov   CX,0

      mov   CL,AL

      mov   AX,DX

      mov   BX,10

      mul   BX               ; Умножаем на 10 уженакопленный результат

      add   AX,CX            ; Прибавляем считанное число

      mov   DX,AX            ; Сохраняем результат

      jmp   InputChar

ErrInput:

      Stc                    ; В случае ошибки ввода  устанавливаем флаг

ExitI10:

      mov   AX,DX            ; Переносим результат в регистр возврата

      pop   CX

      pop   DX

      pop   BX               ; Восстанавливаем регистры

      ret

;*****************************************************************************

; Установка указателя на сегмент переменных

SetDATSeg:

      push  AX

      mov   AX,_Data

      mov   DS,AX

      pop   AX

      ret

;*****************************************************************************

; Установка указателя на проверочный массив

SetArrSeg   proc

      push  AX

      mov   AX,DataSeg

      mov   ES,AX

      pop   AX

      ret

SetArrSeg   endp

;****************************************************************************

;     Процедура вычисления CRC16

;ES — сегмент массива

;DX — адрес начала массива

;BX — длина блока данных

;AX — результат вычислений

;****************************************************************************

CalcCRC     proc 

     

      push  CX                      ;\

      push  BX                      ;- сохранение регистров

      push  DI                      ;/

      push  DX

      mov   DI,DX            ; Загрузка индекса начала массива

      mov   DX,8

      mov   CX,BX                  ; Установка счётчика цикла

      shl   CX,1              ;\

      shl   CX,1              ;- CX=CX*8

      shl   CX,1              ;/

      mov   AX,65535         ; Очистка регистра результата

      mov   BX,ES:[DI]

CRNext:     loop  CRNextTest       ; Цикл по словам массива

      pop   DX

      pop   DI                ;\

      pop   BX                      ;-восстановление регистров

      pop   CX                      ;/

      ret

     

CRNextTest:

      push  AX

      mov   AX,BX

      and   AX,1b

      jz    Shift

      pop   AX

      xor   AL,31h

      push  AX

Shift:      mov   AX,DX

      jz    NewWord

      shr   BX,1

      dec   DX

      jmp   EndShift

NewWord:

      mov   DX,8

      inc   DI

      mov   BX,ES:[DI]

EndShift:

      pop   AX

      jmp   CRNext

CalcCRC     endp

;*****************************************************************************

      END

;*****************************************************************************               

ЗАКЛЮЧЕНИЕ

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

В данной курсовойработе рассмотрены основные этапы программирования на ассемблере, реализованалгоритм выполнения поставленной задачи, а также выполнена трансляция кода висполняемый файл.

СПИСОК ЛИТЕРАТУРЫ:

1.  Финогенов К.Г. Основы языка Ассемблера. – М.: Радио исвязь,2000.

2.  Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3.  Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4.  Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.:Питер, 2000.

www.ronl.ru

Реферат - Язык программирования Assembler

Реферат - Язык программирования Assemblerскачать (30.7 kb.)

Доступные файлы (1):

содержание

1.docx

Реклама MarketGid:

Оренбургский государственный Аграрный УниверситетРЕФЕРАТПо дисциплине: «Языки программирования»«Язык программирования Assembler»

Выполнил: студент 11 группы

специальности КОИБАС

Коржев А.Р.

Проверил: Преподаватель дисциплины

«Языки программирования»

Тарасов А.Д.

Оренбург 2010 год

СОДЕРЖАНИЕ

Введение……………………………………………………………………....... 3
1. История Ассемблера……………………………………………………… 4
2. Программирование на языке Ассемблера……………………………… 5
3. Синтаксис…………………………………………………………..…….... 7
4. Директивы…………………………………………………………………. 8
5. Типы данных……………………………………………………………… 9
6. Преимущества и недостатки……………………………………………... 10
Заключение…………………………………………………………….............. 11
Список использованной литературы………………………………………… 12

ВВЕДЕНИЕПрогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования. Существует множество языков программирования, но мы остановимся на Ассемблере.

Несмотря на то, что в настоящее время программист может использовать большое количество языков программирования, которые гораздо проще Ассемблера, знание Ассемблера и умение программировать на нем никогда не будут лишними. Тем более можно даже выдвинуть доводы:

1. На других языках программирования не всегда возможно написать приложение, которое полно бы удовлетворяло требованиям. А в некоторых случаях полностью невозможно. На языке программирования Ассемблер можно написать любое приложение.

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

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

4. Язык «Ассемблер» позволяет работать непосредственно с аппаратными средствами, что в некоторых случаях дает программисту преимущество и требуемый результат. Приложение на языке высокого уровня работает с аппаратными устройствами через написанные модули, т.е. не позволит программисту что-либо изменить, а, следовательно, получить требуемый результат.

5. Знание языка Ассемблер дает большее преимущество перед теми, кто программирует только на языках высокого уровня. Знающий Ассемблер знает и структуру компьютера, и структуру аппаратных устройств.

^ Программисты уже были знакомы с понятием подпрограммы: Грейс Хоппер и ее коллеги применяли подпрограммы на гарвардском «Марке-1» во время второй мировой войны, однако каждая подпрограмма решала свою специфическую задачу.

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

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

Морис Уилкс назвал мнемоническую схему для «Эдсака» и библиотеку подпрограмм собирающей системой (по-английски assembly system - отсюда слово «ассемблер»), поскольку она собирала последовательности подпрограмм.

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

Использование термина «язык ассемблера» может вызвать ошибочное мнение о существовании единого языка низкого уровня или хотя бы стандарта на такие языки, что абсолютно не соответствует истине. Поэтому при именовании языка, на котором написана конкретная программа, желательно уточнять, для какой архитектуры она предназначена и на каком диалекте языка написана.^

Ассемблерные программы могут быть очень эффективными. Из программистов, с равными навыками и способностями, работающих на языке Ассемблера создать программу более компактную и быстродействующую, чем такую же программу, написанную на языке высокого уровня. Это так практически для всех небольших или средних программ. К сожалению, по мере возрастания размеров, программы на языке Ассемблера теряют часть своих преимуществ. Это происходит из-за необходимого в ассемблерной программе внимания к деталям. Как вы видите, язык Ассемблера требует от вас планирования каждого действия компьютера. В небольших программах это позволяет оптимизировать работу программы с аппаратными средствами. В больших же программах огромное количество деталей может помешать вам эффективно работать над самой программой, даже если отдельные компоненты программы окажутся очень неплохими. Безусловно, программирование на языке Ассемблера отвечает потребностям не каждой программы.

Программы на языке Ассемблера очень точны. Поскольку этот язык позволяет программисту непосредственно работать со всем аппаратным обеспечением, ассемблерная программа может делать то, что недоступно никакой другой программе. Несомненно, что в программировании устройств ввода-вывода, где требуется контроль над отдельными разрядами регистров устройства, программирование на языке Ассемблера - единственный подходящий выбор.

Ясно, что эффективность и точность языка Ассемблера дают определенные преимущества. Но его детализированность создает и некоторые проблемы. Когда же стоит выбирать для программирования язык Ассемблера?

Конечно, вы должны пользоваться программами на языке Ассемблера, когда нет другого способа написать программу. Например, программисты фирмы IBM писали с использованием процедур Ассемблера все программы управления устройствами ввода-вывода для IBM PC. Для управления устройствами ввода-вывода и системой прерываний, потребовалась та точность языка Ассемблера, которую не может обеспечить ни один другой язык программирования. Аналогично, на языке Ассемблера в фирме IBM писались процедуры диагностики, которые должны проверять каждую деталь аппаратуры.

Язык Ассемблера необходим также и в тех случаях, когда главными являются рабочие характеристики программы. Это может быть время исполнения или конечный размер программы. Библиотека математических процедур Фортрана - пример программы, требующей хороших характеристик, как в отношении времени, так и размера. Математические процедуры являются частью любой программы на Фортране, поэтому они должны занимать как можно меньше места. Кроме того, эти процедуры управляют всеми математическими функциями в фортрановской программе и часто используются. Следовательно, они должны исполняться быстро.

Какая программа не подходит для языка Ассемблера? Конечно, вы можете написать на нем любую программу, однако с большой программой лучше работать в языке высокого уровня, таком как Бэйсик или Паскаль. Эти языки позволяют вам сосредоточиться на своей проблеме. Вам не приходится непосредственно иметь дело с тонкостями аппаратного оборудования и процессора. Языки высокого уровня позволяют вам отступить назад и за деревьями увидеть лес.

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

Самыми популярными на сегодняшний день являются пакеты Turbo Assembler (TASM) фирмы Borland, Macro Assembler for Windows32 (MASM32), созданный Hutch (на основе старого MASM фирмы Microsoft), а также Flat Assembler (FASM), и Netwide Assembler (NASM), развиваемый командой NASM Development Team. Все эти ассемблеры предоставляют весьма широкие возможности для программиста. На них можно писать программы как под DOS, так и под Windows.

Существует также множество других видов ассемблера, число которых растет. Например: CodeX Assembler, Gema Assembler, Light Macro Assembler (LASM), Lazy Assembler (LZASM), Table Driven Assembler (TDASM), NewBasic++ Assembler (NBASM), TMA Macro Assembler и др.3. СИНТАКСИС

Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако, существуют стандарты де-факто — традиционные подходы, которых придерживаются большинство разработчиков языков ассемблера. Основными такими стандартами являются Intel-синтаксис и AT&T-синтаксис.

Общий формат записи инструкций одинаков для обоих стандартов:

`[метка:] опкод [операнды] [;комментарий]`

Опкод — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.). В качестве операндов могут выступать константы, названия регистров, адреса в оперативной памяти и пр.. Различия между стандартами Intel и AT&T касаются, в основном, порядка перечисления операндов и их синтаксиса при различных методах адресации. Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров Motorola, ARM, x86). Они описываются в спецификации процессоров. Например, процессор Zilog Z80 наследовал систему команд Intel i8080, расширил ее и поменял мнемоники (и обозначения регистров) на свой лад. Например, сменил интеловские mov на ld. Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel. и в данный момент половина ассемблеров для Fireball работает с интеловскими мнемониками, а половина с мнемониками Zilog.

4. ДИРЕКТИВЫ

Кроме инструкций, программа может содержать директивы: команды, не переводящиеся непосредственно в машинные инструкции, а управляющие работой компилятора. Набор и синтаксис их значительно разнятся и зависят не от аппаратной платформы, а от используемого компилятора (порождая диалекты языков в пределах одного семейства архитектур). В качестве набора директив можно выделить:

- определение данных (констант и переменных)

- управление организацией программы в памяти и параметрами выходного файла

- задание режима работы компилятора

- всевозможные абстракции (т.е. элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов.

^

При программировании на языке ассемблера используются данные следующих типов:

Непосредственные данные, представляющие собой числовые или символьные значения, являющиеся частью команды.

Непосредственные данные формируются программистом в процессе написания программы для конкретной команды ассемблера.

Данные простого типа, описываемые с помощью ограниченного набора директив резервирования памяти, позволяющих выполнить самые элементарные операции по размещению и инициализации числовой и символьной информации. При обработке этих директив ассемблер сохраняет в своей таблице символов информацию о местоположении данных (значения сегментной составляющей адреса и смещения) и типе данных, то есть единицах памяти, выделяемых для размещения данных в соответствии с директивой резервирования и инициализации данных.

Эти два типа данных являются элементарными, или базовыми; работа с ними поддерживается на уровне системы команд микропроцессора. Используя данные этих типов, можно формализовать и запрограммировать практически любую задачу. Но насколько это будет удобно — вот вопрос.

Данные сложного типа, которые были введены в язык ассемблера с целью облегчения разработки программ. Сложные типы данных строятся на основе базовых типов, которые являются как бы кирпичиками для их построения. Введение сложных типов данных позволяет несколько сгладить различия между языками высокого уровня и ассемблером. У программиста появляется возможность сочетания преимуществ языка ассемблера и языков высокого уровня (в направлении абстракции данных), что в конечном итоге повышает эффективность конечной программы.

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

^ К преимуществам Ассемблера можно отнести:

1. Данный язык программирования позволяет создавать приложения, которые будут более эффективны, чем аналогичные приложения, написанные на языке высокого уровня, т.е. приложения будут более короткими и при этом более быстро выполнимыми.

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

К недостаткам языка следует отнести:

1. По мере увеличения своего размера программа на Ассемблере теряет наглядность. Это связано с тем, что в ассемблерных программах следует уделять много внимания деталям. Язык требует от вас планирования каждого шага ЭВМ. Конечно, в случае небольших программ это позволяет сделать их оптимальными с точки зрения эффективности использования аппаратных средств. В случае же больших программ бесконечное число деталей может помешать вам добиться оптимальности программы в целом, несмотря на то, что отдельные фрагменты программы будут написаны очень хорошо.

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

ЗАКЛЮЧЕНИЕЯзык Ассемблера - мощное средство программирования. Он позволяет программисту осуществлять всестороннее управление аппаратными средствами ЭВМ. Однако такое управление заставляет программиста вникать в детали, далекие от основного содержания программы. Все преимущества языка Ассемблера оборачиваются подчас пустой тратой времени на многочисленные детали.

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

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

ЛИТЕРАТУРА

  1. Ваулин А.С. Языки программирования. кн.5 - М.: Школа-Пресс, 1993.
  2. Вычислительная техника и программирование. / Под ред. А.В. Петрова – М.: Высш. шк., 1990.
  3. Касвандс Э.Г. Введение в программирование на языке Ассемблер. ч.1 – М.: ЮНИТИ – ДАНА, 1993.
  4. Малютин Э.А. Языки программирования. – М.: Просвещение, 1982.
  5. Что такое ассемблер. [Электронный ресурс]. – Режим доступа:
  6. Журнал «КомпьюТерра» №37-38 1994.
  7. http://www.assembler.webservis.ru
Скачать файл (30.7 kb.)

gendocs.ru

Доклад - Ассемблер - Информатика, программирование

МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

ПОЯСНИТЕЛЬНАЯЗАПИСКА К КУРСОВОЙ РАБОТЕ

по дисциплине:

«Системное программирование»

 

 

 

Выполнил:Тябенков А.О.

студентIV курса МГОУ

Специальность:200106

Шифр:6041013/ с

Проверил:Юрагов Е.А.

2008

МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ  УНИВЕРИТЕТ

Факультетинформатики и радиоэлектроники

Кафедра:Информационная измерительная техника

Специальность:200106

ЗАДАНИЕ

Накурсовой проект  Тябенкова Антона Олеговича        Шифр: 6041013/с

1. Тема работы:

 На языкеассемблера разработать алгоритм контроля, на циклический CRC-код, массиваданных хранящегося в некоторой  области памяти. Код должен быть сохранен дляпоследующей  периодической проверки массива данных. В случае несовпадения  наэкран должно выводиться сообщение об искажении данных.

2. Содержаниепояснительной записки:

Введение

1. Созданиепрограммы на ассемблере

2. Синтаксисассемблера

3. Описаниеалгоритма

4. Описаниепрограммы

Заключение

Список литературы

3.Дата выдачи задания:

4.Срок выполнения:

Заданиевыдал     _______________Юрагов Е.А.

Заданиепринял   _______________Тябенков А.О.

СОДЕРЖАНИЕ

Введение--------------------------------------------------------------------------------- 2

1. Создание программы на ассемблере---------------------------------------- 6

2. Синтаксис ассемблера------------------------------------------------------------ 12

3. Описание алгоритма-------------------------------------------------------------- 17

4. Описание программы------------------------------------------------------------ 19

Приложение 1 Блок-схема алгоритма — 20

Приложение 2 Листинг программы--------------------------------------------- 21

Заключение----------------------------------------------------------------------------- 26

Список литературы------------------------------------------------------------------- 27

ВВЕДЕНИЕ

 

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

В то же время,внося в микропроцессор принципиальные изменения, разработчики были вы­нужденыпостоянно иметь в виду необходимость обеспечения совмести­мости новых моделейсо старыми, чтобы не отпугивать потенциального покупателя перспективой полнойзамены освоенного или разработанно­го им программного обеспечения. В результатесовременные микропро­цессоры типа Pentium, обеспечивая такие возможности, как32-битную адресацию почти неограниченных объемов памяти, многозадачный ре­жим содновременным выполнением нескольких программ, аппаратные средства защитыоперационной системы и прикладных программ друг от друга, богатый набордополнительных эффективных команд и способов адресации, в то же время могутработать (и часто работают) в режиме первых микропроцессоров типа 8086, используявсего лишь 1 мегабайт оперативной памяти, 16-разрядные операнды (т. е. числа вдиапазоне до 216-1=65535) и ограниченный состав команд. Посколькупрограммирова­ние на языке ассемблера напрямую затрагивает аппаратныевозможности микропроцессора, прежде всего, следует выяснить, в какой степенипро­граммист может использовать новые возможности микропроцессоров в своихпрограммах, и какие проблемы программной несовместимости мо­гут при этомвозникнуть.

Первыеперсональные компьютеры корпорации IBM, появившиеся в 1981 г. и получившиеназвание IBM PC, использовали в качестве цент­рального вычислительного узла16-разрядный микропроцессор с 8-раз­рядной внешней шиной Intel 8088. Вдальнейшем в персональных компью­терах стал использоваться и другой вариантмикропроцессора, 8086, ко­торый отличался от 8088 тем, что являлся полностью16-разрядным. С тех пор его имя стало нарицательным, и в программах,использующих только возможности процессоров 8088 или 8086, говорят, что ониработают в режиме 86-го процессора.

В 1983 г.корпорацией Intel был предложен микропроцессор 80286, в котором был реализованпринципиально новый режим работы, получив­ший название защищенного. Однакопроцессор 80286 мог работать и в режиме 86-го процессора, который сталиназывать реальным.

В дальнейшем насмену процессору 80286 пришли модели 80386, i486 и, наконец, различные вариантыпроцессора Pentium. Все они могут ра­ботать и в реальном, и в защищенномрежимах. Хотя каждая следующая модель была значительно совершеннее предыдущей(в частности, почти на два порядка возросла скорость работы процессора, начинаяс модели 80386 процессор стал 32-разрядным, а в процессорах Pentium реализовандаже 64-разрядный обмен данными с системной шиной), однако с точки зренияпрограммиста все эти процессоры весьма схожи. Основным их ка­чеством являетсяналичие двух режимов работы — реального и защищен­ного. Строго говоря, всовременных процессорах реализован еще и третий режим — виртуального 86-гопроцессора, или V86, однако в плане ис­пользования языка ассемблера этот режимне отличается от обычного режима 86-го процессора, и в этой книге мы егокасаться не будем.

Реальный изащищенный режимы прежде всего принципиально раз­личаются способом обращения коперативной памяти компьютера. Метод адресации памяти, используемый в реальномрежиме, позволяет адресо­вать память лишь в пределах 1 Мбайт; в защищенномрежиме использует­ся другой механизм (из-за чего, в частности, эти режимы иоказались полностью несовместимыми), позволяющий обращаться к памяти объе­момдо 4 Гбайт. Другое важное отличие защищенного режима заключается в аппаратнойподдержке многозадачности с аппаратной же (т.е. реализо­ванной в самоммикропроцессоре) защитой задач друг от друга.

Реальный изащищенный режимы имеют прямое отношение к работе операционной системы,установленной на компьютере.

В настоящее времяна персональных компьютерах типа IBM PC ис­пользуются в основном два классаоперационных систем (оба — разработ­ки корпорации Microsoft): однозадачнаятекстовая система MS-DOS и многозадачная графическая система Windows.Операционная система MS-DOS является системой реального режима; другимисловами, она исполь­зует только средства процессора 8086, даже если онаустановлена на ком­пьютере с процессором Pentium. Система Windows — это системазащи­щенного режима; она значительно более полно использует возможностисовременных процессоров, в частности, многозадачность и расширенное адресноепространство. Разумеется, система Windows не могла бы рабо­тать с процессором8086, так как в нем не был реализован защищенный режим.

Соответственнодвум типам операционных систем, и все программ­ное обеспечение персональныхкомпьютеров подразделяется на два клас­са: программы, предназначенные дляработы под управлением MS-DOS (их часто называют приложениями DOS) и программы,предназначен­ные для системы Windows (приложения Windows). Естественно, приложе­ния.DOS могут работать только в реальном режиме, а приложения Windows — только взащищенном.

Таким образом,выражения «программирование в системе MS-DOS», «программирование в реальномрежиме» и «программирование 86-го про­цессора» фактически являются синонимами.При этом следует подчерк­нуть, что хотя процессор 8086, как микросхема, ужедавно не используется, его архитектура и система команд целиком вошли всовременные про­цессоры. Лишь относительно небольшое число команд современных процессоровспециально предназначены для организации защищенного режима и распознаютсяпроцессором, только когда он работает в защи­щенном режиме.

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

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

1.        СОЗДАНИЕ ПРОГРАММЫ НА АССЕМБЛЕРЕ.

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

В большинствеслучаев рекомендуется  следую­щий процесс разработки программы на ассемблере:

1.Этап постановкии формулировки задачи:

·       изучение предметной области и сбор материала впроблемно-ориентиро­ванном контексте;

·       определение назначения программы, выработка требований к нейи пред­ставление требований, если возможно, в формализованном виде;

·       формулирование требований к представлению исходных данных ивы­ходных результатов;

·       определение структур входных и выходных данных;

·       формирование ограничений и допущений на исходные и выходныедан­ные.

2.Этаппроектирования:

·       формирование «ассемблерной» модели задачи;

·       выбор метода реализации задачи;

·       разработка алгоритма реализации задачи;

·       разработка структуры программы в соответствии с выбранноймоделью памяти.

3. Этап кодирования:

·       уточнение структуры входных и выходных данных и определениеассемб­лерного формата их представления;

·       программирование задачи;

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

4.   Этап отладкии тестирования:

·       составление тестов для проверки правильности работыпрограммы;

·       обнаружение, локализация и устранение ошибок в программе,выявлен­ных в тестах;

·       корректировка кода программы и ее описания.

5.   Этапэксплуатации и сопровождения:

·       настройка программы на конкретные условия использования;

·       обучение пользователей работе с программой;

·       организация сбора сведений о сбоях в работе программы,ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства рабеты с программой;

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

К порядкуприменения и полноте выполнения перечисленных этапов нужно подходить разумно.Многое определяется особенностями конкретной задачи, ее назначением, объемомкода и обрабатываемых данных, другими характеристиками задачи. Некоторые изэтих этапов могут либо выполняться одновременно с другими этапами, либо вовсеотсутствовать.

Традиционно усуществующих реализаций ассемблера нет интегрированной среды, подобнойинтегрированным средам Turbo Pascal, Turbo С или Visual C++. Поэтому длявыполнения всех функций по вводу кода программы, ее трансляции, редактированиюи отладке необходимо использовать отдельные служебные программы. Большая частьих входит в состав специализированных пакетов ассемблера.

На рисунке одинприведена общая схема процесса разработки программы на ассемблере. На схемевыделено четыре шага процесса. На первом шаге, когда вводится код программы,можно использовать любой текстовый редактор. Основным требованием к немуявляется то, чтобы он не вставлял посторонних символов (спецсимволовредактирова­нии). Файл должен иметь расширение. asm.

/>

Рис. 1. «Процессразработки программы на ассемблере».

Программы,реализующие остальные шаги схемы, входят в состав программного пакетаассемблера. После написания текста программы на ассемблере наступает следующийэтап — трансляция программы. На этом шаге формируется объектный модуль, которыйвключает в себя представление исходной програм­мы в машинных кодах и некоторуюдругую информацию, необходимую для отладки и компоновки его с другими модулями.Традиционно на рынке ассемблеров для микропроцессоров фирмы Intel имеется двапакета: «Макроассемблер» MASM фирмы Microsoft и Turbo Assembler TASM фирмыBorland.

У этих пакетовмного общего. Пакет макроассемблера фирмы Microsoft (MASM) получил своеназвание потому, что он позволял программисту зада­вать макроопределения (илимакросы), представляющие собой именованные группы команд. Они обладали темсвойством, что их можно было вставлять в программу в любом месте, указав толькоимя группы в месте вставки. Пакет Turbo Assembler (TASM) интересен тем, чтоимеет два режима работы. Один из этих режимов, называемый MASM, поддерживаетвсе основные возможнос­ти макроассемблера MASM. Другой режим, называемый IDEAL,предоставляет более удобный синтаксис написания программ, более эффективноеиспользова­ние памяти при трансляции программы и другие новшества, приближающиекомпилятор ассемблера к компиляторам языков высокого уровня.

В эти пакетывходят трансляторы, компоновщики, отладчики и другие утили­ты для повышенияэффективности процесса разработки программ на ассембле­ре.

В данной курсовойработе для получения объектного модуля исходный файл подвергается трансляциипри помощи про­граммы tasm.exe из пакета TASM.

После устраненияошибок можно приступать к следующему шагу — созданию исполняемого(загрузочного) модуля, или, как еще называют этот процесс, к компоновкепрограммы. Главная цель этого шага — преобразовать код и данные в объектныхфайлах в их перемещаемое выполняемое отображение. Процесс создания исполняемогомодуля разделяют на 2 шага — трансляцию и компоновку. Это сделано намеренно длятого, чтобы можно было объединять вместе несколько модулей (написанных на одномили нескольких языках). Формат объектного файла позволяет, при определенныхусловиях, объединить несколько отдельно оттранслированных исходных модулей водин модуль. При этом в функции компоновщика входит разрешение внешних ссылок(ссылок на процедуры и переменные) в этих модулях. Резуль­татом работыкомпоновщика является создание загрузочного файла с расширением ехе. Послеэтого операционная система может загрузить такой файл  и выполнить его.

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

На этапе отладки,используя описание алгоритма, выполняется контроль правильностифункционирования как отдельных участков кода, так и всей программы в целом. Нодаже успешное окончание отладки еще не является гарантией того, что программабудет работать правильно со всеми возможными исходными данными. Поэтому нужнообязательно провести тестирование программы, то есть проверить ее работу на«пограничных» и заведомо некорректных исходных данных. Для этого составляютсятесты.

Специфика программна ассемблере состоит в том, что они интенсивно работают с аппаратнымиресурсами компьютера. Это обстоятельство заставляет программиста постоянноотслеживать содержимое определенных регистров и областей памяти. Естественно,что человеку трудно следить за этой информацией с большой степенью детализации.Поэтому для локализации логических ошибок в программах используют специальныйтип программного обеспечения — программные отладчики.

Отладчики бываютдвух типов:

·       интегрированные — отладчик реализован в виде интегрированнойсреды типа среды для языков Turbo Pascal, Quick С и т.д.;

·       автономные — отладчик представляет собой отдельную программу.

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

2.СИНТАКСИС АССЕМБЛЕРА

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

Предложенияассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка имеющие смысл длятранслятора. Лексемами являются:

·         идентификаторы — последовательности допустимых символов,использующиеся для обозначения таких объектов программы, как коды операций,имена переменных и названия меток. Правило записи идентификаторов заключается вследующем. Идентификатор может состоять из одного или нескольких символов. Вкачестве символов можно использовать буквы латинского алфавита, цифры инекоторые специальные знаки — _, ?, $, @.

·         цепочки символов — последовательности символов, заключенные водинарные или двойные кавычки;

·         целые числа в одной из следующих систем счисления: двоичной,десятичной, шестнадцатеричной. Отождествление чисел при записи их в программахна ассемблере производится по определенным правилам. Десятичные числа нетребуют для своего отождествления указания каких-либо дополнительных символов.

Практически каждоепредложение содержит описание объекта, над которым или при помощи котороговыполняется некоторое действие. Эти объекты называются операндами. Их можноопределить так: операнды — это объекты (некоторые значения, регистры или ячейкипамяти), на которые действуют инструкции или директивы, либо это объекты,которые определяют или уточняют действие инструкций или директив.

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

Рассмотримклассификацию операндов, поддерживаемых транслятором ассемблера.

Постоянныеили непосредственные операнды —число, строка, имя или вы­ражение, имеющие некоторое фиксированное значение.Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программыв па­мять.

Адресныеоперанды — задают физическое расположениеоперанда в памяти с помощью указания двух составляющих адреса: сегмента исмещений (рис. 2).

/>

Рис. 2. «Синтаксисописания адресных операндов».

Перемещаемыеоперанды — любые символьные имена,представляющие некоторые адреса памяти. Эти адреса могут обозначатьместоположение в памяти некоторой инструкции (если операнд — метка) или данных(если опе­ранд — имя области памяти в сегменте данных). Перемещаемые операндыотличаются от адресных тем, что они не привязаны к конкретному адресуфизической памяти. Сегментная составляющая адреса перемещаемого операнданеизвестна и будет определена после загрузки программы в память для выполнения.

Считчикадреса — специфический вид операнда. Онобозначается знаком $. Специфика этого  операнда в том, что когда трансляторассемблера встречает в  исходной программе этот символ, то он подставляетвместо него текущее значение  счетчика адреса. Значение счетчика адреса, иликак его иногда называют  счетчика размещения, представляет собой смещениетекущей ма­шинной команды относительно начала сегмента кода.

Базовыйи индексный операнды. Этот тип операндовиспользуется для реали­зации косвенной базовой, косвенной индексной адресацииили их комбина­ций и расширений.

Операнды являютсяэлементарными компонентами, из которых формируется часть машинной команды,обозначающая объекты, над которыми выполняется операция. В более общем случаеоперанды могут входить как составные части в более сложные образования,называемые выражениями. Выражения представляют собой комбинации операндов иоператоров, рассматриваемые как единое целое. Результатом вычисления выраженияможет быть адрес некоторой ячейки памяти или некоторое константное (абсолютное)значение. В табл. 2.2 приведены поддерживаемые языком ассемблера операторы иперечислены их приоритеты.

Арифметическиеоператоры. К ним относятся унарные операторы«+» и «-», бинарные «+» и «-», операторы умножения «*», целочисленного деления«/», получения остатка от деления «mod». Эти операторы расположены на уровняхприоритета 6, 7, 8 в табл. 2.1.

Операторысдвига выполняют сдвиг выражения науказанное количество раз­рядов.

Операторысравнения (возвращают значение «истина» или«ложь») предназначены для формирования логических выражений (табл. 5.1). IЛогическое значение «истина» соответствует цифровой единице, а «ложь» —  нулю.

Табл. 2.1.

Операторы сравнения

Оператор Значение eq ИСТИНА, если выражение_1 равно выражение_2 пе ИСТИНА, если выражение_1 не равно выражение_2 It ИСТИНА, если выражение_1 меньше выражение_2 le ИСТИНА, если выражение_1 меньше или равно выражение_2 gt ИСТИНА, если выражение_1 больше выражение_2 ge ИСТИНА, если выражение_1 больше или равно выражение_2 eq ИСТИНА, если выражение_1 равно выражение_2 пе ИСТИНА, если выражение_1 не равно выражение_2

Логическиеоператоры выполняют над выражениямипобитовые операции. Выражения должны быть абсолютными, то есть такими,численное значение которых может быть вычислено транслятором.

Индексныйоператор [ ]. Скобки тоже являютсяоператором, и транслятор их наличие воспринимает, как указание сложить значе­ниевыражение_1 за этими скобками с выражение_2, заключенным в скобки.

Операторпереопределения типа ptr  применяется дляпереопределения или уточнения  имя типа метки или переменной, определяемыхвыражением. Тип может принимать одно из следующих значений: byte, word, dword,qword, tbyte, noar, far. Оператор ptr позволяет непосредственно в командепереопределить тип и выполнить команду.

Операторпереопределения сегмента  :   (двоеточие)заставляет вычислять физический адрес относительно конкретно задаваемойсегментной составляющей: «имя сегментного регистра», «имя сегмента» изсоответствующей директивы SEGMENT или «имя группы».

Операторименования типа структуры. (точка) также заставляет транслятор производитьопределенные вычисления

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

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

3. ОПИСАНИЕАЛГОРИТМА

Алгоритм реализуетвычисление CRC8 делением заданного массива данных на образующий полином x8+x5+x4+1. Деление выполнено последовательным вычитанием по модулю 2полинома из исходной последовательности.

Для этогоорганизован цикл по словам исходной последовательности и цикл по разрядногосдвига внутри слова. Поскольку удобнее просматривать массив в порядкеувеличения адреса (от младшего к старшему), процедура реализует зеркальныйалгоритм.

Подробнее о томкак выполняется деление при вычислении CRC смотри в прилагаемыхисточниках.

Для процедурывычисления исходные данные передаются через регистры. Сегментный регистр ES должен содержатьсегмент в котором расположен массив, регистр DX – смещение начала массива внутри сегмента, BX – длина массива.Результат накапливается в аккумуляторе AL.

Перед началомвычислений инициируем AX значением FFFFh. В регистр CX заносим длину массива и умножаем её на 8. Таким образом этотрегистр хранит количество разрядов в массиве и используется как счётчик цикловкомандой loop. Дополнять исходную последовательность (проверяемый массив)нулями нет необходимости, т.к. количество разрядов кратно степени образующегомногочлена.

Смещение переносимв регистр DI.

В BX заносим первое словомассива.

Проверяем младшийразряд BX. Если он равен нулю – выполняем сдвиг слова на один разрядвправо,  если нет – выполняем сложение с образующим многочленом по модулю 2, азатем выполняем сдвиг.

Сдвиг по разрядамвыполняется следующим образом. В DX хранится количество сдвигов оставшееся до конца слова(удобнее подсчитывать не количество выполненных сдвигов, а от количестваразрядов в слове до 0). Если в DX – 0, то нужно в DX записать 8, а в BX загрузить следующее слово массива, иначе – просто сдвигаем BX вправо на разряд и уменьшаем DX на 1.

Повторяемсуммирование.

После окончанияпроцедуры аккумулятор AX содержит вычисленное для массива значение CRC8.

Для сохранениярезультата его переносим в переменную result.

Для проверкицелостности массива нужно повторить вычисление контрольной суммы и сравнить созначением в result.

Блок-схемаалгоритма приведена  в приложении 1.

4. ОПИСАНИЕПРОГРАММЫ

Алгоритмопределения CRC реализован в процедуре CalcCRC. Перед вызовом этойпроцедуры необходимо в регистры записать начальные данные — сегментный регистр ES должен содержатьсегмент в котором расположен массив, регистр DX – смещение начала массива внутри сегмента, BX – длина массива.

Программа выполняет следующие операции по выбору пользователя: вычисление CRC массива и записьрезультата в переменную, проверка целостности массива – повторное вычисление CRC и сравнениевычисленного значения с записанным, искажение массива – обратимое изменениеодного бита проверочного массива.

Для вычисления CRC, вызывается процедура CalcCRC, а результатвыполнения сохраняется в переменной result.

При проверкецелостности, вызывается процедура CalcCRC, а результат выполнения сравнивается с сохранённым в переменнойresult. В случае несовпадения, выводится сообщение об ошибке. Присовпадении значений (целостность данных не нарушена) сообщение не выводится ипользователь возвращается в главное меню.

Искажение массиваиспользуется для тестирования программы и демонстрации работы.

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

ПРИЛОЖЕНИЕ  1

Блок-схемаалгоритма

/>

ПРИЛОЖЕНИЕ  2

MODEL SMALL

;*****************************************************************************

;     Сегмент стека

;*****************************************************************************

_Stack      SEGMENT     WORD  'STACK'    

      DB    200h  DUP (?)

_Stack      ENDS

;*****************************************************************************

;     Сегмент тестового массива

;*****************************************************************************

DataSeg     SEGMENT     WORD 'DATA'

TestTab     DB    32 DUP (    \

                  00h, 01h, 02h, 03h, 04h, 05h, 06h,07h, \

                  08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh,0Fh,  \

                  00h, 01h, 02h, 03h, 04h, 05h, 06h,07h, \

                  08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh   \

                  )

DataSeg     ENDS

;*****************************************************************************

;     Сегмент переменных

;*****************************************************************************

_Data SEGMENT     WORD 'DATA'

;*****************************************************************************

FSelMsg     DB    13,10,'Выберите действие:',13,10, \

            13,10,'1-Определить CRC',13,10,          \

            '2-Проверить массив',13,10,        \

            '3-Исказить массив',13,10,         \

            '4-Выход',13,10,        \

            '$'

ByeStr      DB    13,10,'Для продолжения нажмите любую клавишу.$'

ErrorString DB 13,10,'Ошибка ввода',13,10,'$'

ErrorResult DB 13,10,'Данные искажены. CRC8 нарушена.',13,10,'$'

;*****************************************************************************

BegSeg      DW    (?)  ; Сегмент проверочного массива

BegOffs     DW    (?)  ; Начало проверочного массива

Result      DW    (?)  ; Результат вычисления

FuncNum     DB    (?)  ; Выбранная операция

_Data ENDS

;*****************************************************************************

;     Сегмент программы

;*****************************************************************************

      .CODE

;*****************************************************************************

      call  cls              ; Очистка экрана

      call  SetDATSeg        ; Загрузка адреса сегмента переменных

      call  SetArrSeg              ; Установка указателя сегмента массива

     ; Главное меню

Mnu:        call  SelectFunction         ; Выбор операции

      call  cls              ; Очистка экрана

      mov   AL,FuncNum

      ;*******************************

Mnu1: cmp   AL,1             ; Определение чётности

      jne   Mnu2

     ; Установка параметров

      mov   DX,OFFSET TestTab; Смещение начала массива

      mov   BX,30            ; Размер проверяемого блока данных

      ;call TestOdd

      call  CalcCRC

      mov   Result,AX        ; Сохранение результата

      ;*******************************

Mnu2: cmp   AL,2             ; Определить чётность и сравнить с пред.

      jne   Mnu3

      mov   DX,OFFSET TestTab; Смещение начала массива

      mov   BX,30            ; Размер блока данных

      call  CalcCRC

      cmp   Result,AX

      je    Mnu2End

     ; Результат не совпал. Данные искажены. Выдать сообщение об ошибке

      mov   DX,OFFSET ErrorResult

      mov   AH,9h

      int   21h              ; Вывод сообщения обошибке

      mov   DX,OFFSET ByeStr ; Вывод приглашения

      mov   AH,9h

      int   21h

      mov   AH,0Ch     

      mov   AL,01h     

      int   21h              ; Ожидание нажатия любойклавиши

Mnu2End:

      call  cls

      jmp   Mnu

      ;*******************************

Mnu3: cmp   AL,3             ; Искажение масива (первый байт)

      jne   Mnu4

      mov   DI,OFFSET TestTab

      mov   AX,ES:[DI]

      xor   AX,1                   ; Инвертируем младшийбит

      mov   ES:[DI],AX

      ;*******************************

Mnu4: cmp   AL,4             ; Выход из программы

      jne   Mnu

      ;*******************************

      jmp   Exit

     ; Завершение программы

;Exit:

     ; Приостанов перед выходом

      mov   DX,OFFSET ByeStr  ;? Нажмите клавишу??

      mov   AH,9h

      int   21h

      mov   AH,0Ch     

      mov   AL,01h     

      int   21h  

Exit:; Выход

      mov   AH,4Ch

      int   21h

;*****************************************************************************

; Печать новой строки

NewStr:          

      mov   AH,02h

      mov   DL,0Dh

      int   21h

      mov   DL,0Ah

      int   21h

      ret

;*****************************************************************************

      include     cls.prc

;*****************************************************************************

; Главное меню

SelectFunction:

      ;1.1.Вывод строки меню

      mov   DX,OFFSET FSelMsg

      mov   AH,9h

      int   21h

      ;1.2.Выбор функции

      mov   FuncNum,0

      call  input10                ; Считываемномер пункта меню

      mov   FuncNum,AL       ; Сохраняем номер выбранной функции

ExitSF:     ret

;*****************************************************************************

; Подпрограмма ввода числа

input10:

      push  BX               ; Сохраняем регистры

      push  DX

      push  CX

      mov   DX,0             ; Обнуляем регистр хранения результата

InputChar:

      clc

      mov   AH,0Ch

      mov   AL,1

      int   21h              ; Считываем символ с эхом

      cmp   AL,13d

      je    ExitI10                ; Если его код 13? конец ввода

      cmp   AL,'0'

      jb    ErrInput         ; Если код меньше кода символа 0  ошибкаввода

      cmp   AL,'9'

      jg    ErrInput         ; Если код больше кода символа 9  ошибкаввода

      clc

      sub   AX,30h                 ; Получаем из кода символа число

      mov   CX,0

      mov   CL,AL

      mov   AX,DX

      mov   BX,10

      mul   BX               ; Умножаем на 10 уженакопленный результат

      add   AX,CX            ; Прибавляем считанное число

      mov   DX,AX            ; Сохраняем результат

      jmp   InputChar

ErrInput:

      Stc                    ; В случае ошибки ввода  устанавливаем флаг

ExitI10:

      mov   AX,DX            ; Переносим результат в регистр возврата

      pop   CX

      pop   DX

      pop   BX               ; Восстанавливаем регистры

      ret

;*****************************************************************************

; Установка указателя на сегмент переменных

SetDATSeg:

      push  AX

      mov   AX,_Data

      mov   DS,AX

      pop   AX

      ret

;*****************************************************************************

; Установка указателя на проверочный массив

SetArrSeg   proc

      push  AX

      mov   AX,DataSeg

      mov   ES,AX

      pop   AX

      ret

SetArrSeg   endp

;****************************************************************************

;     Процедура вычисления CRC16

;ES — сегмент массива

;DX — адрес начала массива

;BX — длина блока данных

;AX — результат вычислений

;****************************************************************************

CalcCRC     proc 

     

      push  CX                      ;\

      push  BX                      ;- сохранение регистров

      push  DI                      ;/

      push  DX

      mov   DI,DX            ; Загрузка индекса начала массива

      mov   DX,8

      mov   CX,BX                  ; Установка счётчика цикла

      shl   CX,1              ;\

      shl   CX,1              ;- CX=CX*8

      shl   CX,1              ;/

      mov   AX,65535         ; Очистка регистра результата

      mov   BX,ES:[DI]

CRNext:     loop  CRNextTest       ; Цикл по словам массива

      pop   DX

      pop   DI                ;\

      pop   BX                      ;-восстановление регистров

      pop   CX                      ;/

      ret

     

CRNextTest:

      push  AX

      mov   AX,BX

      and   AX,1b

      jz    Shift

      pop   AX

      xor   AL,31h

      push  AX

Shift:      mov   AX,DX

      jz    NewWord

      shr   BX,1

      dec   DX

      jmp   EndShift

NewWord:

      mov   DX,8

      inc   DI

      mov   BX,ES:[DI]

EndShift:

      pop   AX

      jmp   CRNext

CalcCRC     endp

;*****************************************************************************

      END

;*****************************************************************************               

ЗАКЛЮЧЕНИЕ

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

В данной курсовойработе рассмотрены основные этапы программирования на ассемблере, реализованалгоритм выполнения поставленной задачи, а также выполнена трансляция кода висполняемый файл.

СПИСОК ЛИТЕРАТУРЫ:

1.  Финогенов К.Г. Основы языка Ассемблера. – М.: Радио исвязь,2000.

2.  Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3.  Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4.  Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.:Питер, 2000.

www.ronl.ru

Реферат Ассемблер

скачать

Реферат на тему:

План:

Введение

Ассе́мблер (от англ. assembler — сборщик) — компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.

Как и сам язык (ассемблер), ассемблеры, как правило, специфичны конкретной архитектуре, операционной системе и варианту синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.

Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные и непривязанные друг к другу части машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью программы-компоновщика («линкера») может быть скомпонован исполнимый файл.

1. Архитектура x86

1.1. Ассемблеры для DOS

Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM) и Watcom Assembler (WASM). Также в своё время был популярен простой ассемблер A86.

1.2. Windows

При появлении операционной системы Windows появилось расширение TASM, именуемое TASM 5+ (неофициальный пакет, созданный человеком с ником !tE), позволившее создавать программы для выполнения в среде Windows. Последняя известная версия TASM — 5.3, поддерживающая инструкции MMX, на данный момент включена в Turbo C++ Explorer. Но официально развитие программы полностью остановлено.

Microsoft поддерживает свой продукт под названием Microsoft Macro Assembler. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал пакет для программирования на MASM под названием «MASM32».

1.3. GNU и GNU/Linux

В состав операционной системы GNU входит пакет binutils, включающий в себя ассемблер gas (GNU Assembler), использующий AT&T-синтаксис, в отличие от большинства других популярных ассемблеров, которые используют Intel-синтаксис (поддерживается с версии 2.10).

1.4. Переносимые ассемблеры

Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM (Netwide Assembler).

Yasm — это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключениями).

flat assembler (fasm) — молодой ассемблер под модифицированной для запрета перелицензирования (в том числе под GNU GPL) BSD-лицензией. Есть версии для KolibriOS, Linux, DOS и Windows; использует Intel-синтаксис и поддерживает инструкции x86-64.

2. Архитектуры RISC

2.1. MCS-51

MCS-51 (Intel 8051) — классическая архитектура микроконтроллера. Для неё существует кросс-ассемблер ASM51, выпущенный корпорацией MetaLink.

Кроме того, многие фирмы — разработчики программного обеспечения, такие как IAR или Keil, представили свои варианты ассемблеров. В ряде случаев применение этих ассемблеров оказывается более эффективным благодаря удобному набору директив и наличию среды программирования, объединяющей в себе профессиональный ассемблер и язык программирования Си, отладчик и менеджер программных проектов.

2.2. AVR

На данный момент существуют 2 компилятора производства Atmel (AVRStudio 3 и AVRStudio4). Вторая версия — попытка исправить не очень удачную первую.

В рамках проекта AVR-GCC (он же WinAVR) существует компилятор avr-as (это портированный под AVR ассемблер GNU as из GCC).

Также существует свободный минималистический компилятор avra[1].

2.3. ARM

2.4. PIC

Пример "программы" на языке Assembler для микроконтроллера PIC16F628A:

LIST p=16F628A __CONFIG 0309H STATUS equ 0x003 TRISB equ 0x086 PORTB equ 0x006 RP0 equ 5 org 0 goto start start: bsf STATUS,RP0 movlw .00 movwf TRISB bcf STATUS,RP0 led: movlw .170 movwf PORTB goto led end

2.5. AVR32

2.6. MSP430

2.7. PowerPC

Программный пакет The PowerPC Software Development Toolset от IBM включает в себя ассемблер для PowerPC.

2.8. MIPS

Заготовка раздела Этот раздел не завершён.Вы поможете проекту, исправив и дополнив его.

3. Архитектуры MISC

Заготовка раздела Этот раздел не завершён.Вы поможете проекту, исправив и дополнив его.

3.1. SeaForth

Существуют:

4. Макроассемблер

Не следует путать с MASM.

Макроассемблер (от греч. μάκρος — большой, обширный) — макропроцессор, базовым языком которого является язык ассемблера.[2]

5. Ассемблирование и компилирование

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

Примечания

  1. Проект Ассемблер - link8 на сайте SourceForge.net
  2. Словарь по кибернетике / Под редакцией академика В. С. Михалевича. — 2-е. — Киев: Главная редакция Украинской Советской Энциклопедии имени М. П. Бажана, 1989. — 751 с. — (С48). — 50000 экз. — ISBN 5-88500-008-5

wreferat.baza-referat.ru

Курсовая работа - Ассемблер - Информатика, программирование

МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

ПОЯСНИТЕЛЬНАЯЗАПИСКА К КУРСОВОЙ РАБОТЕ

по дисциплине:

«Системное программирование»

 

 

 

Выполнил:Тябенков А.О.

студентIV курса МГОУ

Специальность:200106

Шифр:6041013/ с

Проверил:Юрагов Е.А.

2008

МОСКОВСКИЙГОСУДАРСТВЕННЫЙ ОТКРЫТЫЙ  УНИВЕРИТЕТ

Факультетинформатики и радиоэлектроники

Кафедра:Информационная измерительная техника

Специальность:200106

ЗАДАНИЕ

Накурсовой проект  Тябенкова Антона Олеговича        Шифр: 6041013/с

1. Тема работы:

 На языкеассемблера разработать алгоритм контроля, на циклический CRC-код, массиваданных хранящегося в некоторой  области памяти. Код должен быть сохранен дляпоследующей  периодической проверки массива данных. В случае несовпадения  наэкран должно выводиться сообщение об искажении данных.

2. Содержаниепояснительной записки:

Введение

1. Созданиепрограммы на ассемблере

2. Синтаксисассемблера

3. Описаниеалгоритма

4. Описаниепрограммы

Заключение

Список литературы

3.Дата выдачи задания:

4.Срок выполнения:

Заданиевыдал     _______________Юрагов Е.А.

Заданиепринял   _______________Тябенков А.О.

СОДЕРЖАНИЕ

Введение--------------------------------------------------------------------------------- 2

1. Создание программы на ассемблере---------------------------------------- 6

2. Синтаксис ассемблера------------------------------------------------------------ 12

3. Описание алгоритма-------------------------------------------------------------- 17

4. Описание программы------------------------------------------------------------ 19

Приложение 1 Блок-схема алгоритма — 20

Приложение 2 Листинг программы--------------------------------------------- 21

Заключение----------------------------------------------------------------------------- 26

Список литературы------------------------------------------------------------------- 27

ВВЕДЕНИЕ

 

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

В то же время,внося в микропроцессор принципиальные изменения, разработчики были вы­нужденыпостоянно иметь в виду необходимость обеспечения совмести­мости новых моделейсо старыми, чтобы не отпугивать потенциального покупателя перспективой полнойзамены освоенного или разработанно­го им программного обеспечения. В результатесовременные микропро­цессоры типа Pentium, обеспечивая такие возможности, как32-битную адресацию почти неограниченных объемов памяти, многозадачный ре­жим содновременным выполнением нескольких программ, аппаратные средства защитыоперационной системы и прикладных программ друг от друга, богатый набордополнительных эффективных команд и способов адресации, в то же время могутработать (и часто работают) в режиме первых микропроцессоров типа 8086, используявсего лишь 1 мегабайт оперативной памяти, 16-разрядные операнды (т. е. числа вдиапазоне до 216-1=65535) и ограниченный состав команд. Посколькупрограммирова­ние на языке ассемблера напрямую затрагивает аппаратныевозможности микропроцессора, прежде всего, следует выяснить, в какой степенипро­граммист может использовать новые возможности микропроцессоров в своихпрограммах, и какие проблемы программной несовместимости мо­гут при этомвозникнуть.

Первыеперсональные компьютеры корпорации IBM, появившиеся в 1981 г. и получившиеназвание IBM PC, использовали в качестве цент­рального вычислительного узла16-разрядный микропроцессор с 8-раз­рядной внешней шиной Intel 8088. Вдальнейшем в персональных компью­терах стал использоваться и другой вариантмикропроцессора, 8086, ко­торый отличался от 8088 тем, что являлся полностью16-разрядным. С тех пор его имя стало нарицательным, и в программах,использующих только возможности процессоров 8088 или 8086, говорят, что ониработают в режиме 86-го процессора.

В 1983 г.корпорацией Intel был предложен микропроцессор 80286, в котором был реализованпринципиально новый режим работы, получив­ший название защищенного. Однакопроцессор 80286 мог работать и в режиме 86-го процессора, который сталиназывать реальным.

В дальнейшем насмену процессору 80286 пришли модели 80386, i486 и, наконец, различные вариантыпроцессора Pentium. Все они могут ра­ботать и в реальном, и в защищенномрежимах. Хотя каждая следующая модель была значительно совершеннее предыдущей(в частности, почти на два порядка возросла скорость работы процессора, начинаяс модели 80386 процессор стал 32-разрядным, а в процессорах Pentium реализовандаже 64-разрядный обмен данными с системной шиной), однако с точки зренияпрограммиста все эти процессоры весьма схожи. Основным их ка­чеством являетсяналичие двух режимов работы — реального и защищен­ного. Строго говоря, всовременных процессорах реализован еще и третий режим — виртуального 86-гопроцессора, или V86, однако в плане ис­пользования языка ассемблера этот режимне отличается от обычного режима 86-го процессора, и в этой книге мы егокасаться не будем.

Реальный изащищенный режимы прежде всего принципиально раз­личаются способом обращения коперативной памяти компьютера. Метод адресации памяти, используемый в реальномрежиме, позволяет адресо­вать память лишь в пределах 1 Мбайт; в защищенномрежиме использует­ся другой механизм (из-за чего, в частности, эти режимы иоказались полностью несовместимыми), позволяющий обращаться к памяти объе­момдо 4 Гбайт. Другое важное отличие защищенного режима заключается в аппаратнойподдержке многозадачности с аппаратной же (т.е. реализо­ванной в самоммикропроцессоре) защитой задач друг от друга.

Реальный изащищенный режимы имеют прямое отношение к работе операционной системы,установленной на компьютере.

В настоящее времяна персональных компьютерах типа IBM PC ис­пользуются в основном два классаоперационных систем (оба — разработ­ки корпорации Microsoft): однозадачнаятекстовая система MS-DOS и многозадачная графическая система Windows.Операционная система MS-DOS является системой реального режима; другимисловами, она исполь­зует только средства процессора 8086, даже если онаустановлена на ком­пьютере с процессором Pentium. Система Windows — это системазащи­щенного режима; она значительно более полно использует возможностисовременных процессоров, в частности, многозадачность и расширенное адресноепространство. Разумеется, система Windows не могла бы рабо­тать с процессором8086, так как в нем не был реализован защищенный режим.

Соответственнодвум типам операционных систем, и все программ­ное обеспечение персональныхкомпьютеров подразделяется на два клас­са: программы, предназначенные дляработы под управлением MS-DOS (их часто называют приложениями DOS) и программы,предназначен­ные для системы Windows (приложения Windows). Естественно, приложе­ния.DOS могут работать только в реальном режиме, а приложения Windows — только взащищенном.

Таким образом,выражения «программирование в системе MS-DOS», «программирование в реальномрежиме» и «программирование 86-го про­цессора» фактически являются синонимами.При этом следует подчерк­нуть, что хотя процессор 8086, как микросхема, ужедавно не используется, его архитектура и система команд целиком вошли всовременные про­цессоры. Лишь относительно небольшое число команд современных процессоровспециально предназначены для организации защищенного режима и распознаютсяпроцессором, только когда он работает в защи­щенном режиме.

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

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

1.        СОЗДАНИЕ ПРОГРАММЫ НА АССЕМБЛЕРЕ.

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

В большинствеслучаев рекомендуется  следую­щий процесс разработки программы на ассемблере:

1.Этап постановкии формулировки задачи:

·       изучение предметной области и сбор материала впроблемно-ориентиро­ванном контексте;

·       определение назначения программы, выработка требований к нейи пред­ставление требований, если возможно, в формализованном виде;

·       формулирование требований к представлению исходных данных ивы­ходных результатов;

·       определение структур входных и выходных данных;

·       формирование ограничений и допущений на исходные и выходныедан­ные.

2.Этаппроектирования:

·       формирование «ассемблерной» модели задачи;

·       выбор метода реализации задачи;

·       разработка алгоритма реализации задачи;

·       разработка структуры программы в соответствии с выбранноймоделью памяти.

3. Этап кодирования:

·       уточнение структуры входных и выходных данных и определениеассемб­лерного формата их представления;

·       программирование задачи;

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

4.   Этап отладкии тестирования:

·       составление тестов для проверки правильности работыпрограммы;

·       обнаружение, локализация и устранение ошибок в программе,выявлен­ных в тестах;

·       корректировка кода программы и ее описания.

5.   Этапэксплуатации и сопровождения:

·       настройка программы на конкретные условия использования;

·       обучение пользователей работе с программой;

·       организация сбора сведений о сбоях в работе программы,ошибках в выходных данных, пожеланиях по улучшению интерфейса и удобства рабеты с программой;

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

К порядкуприменения и полноте выполнения перечисленных этапов нужно подходить разумно.Многое определяется особенностями конкретной задачи, ее назначением, объемомкода и обрабатываемых данных, другими характеристиками задачи. Некоторые изэтих этапов могут либо выполняться одновременно с другими этапами, либо вовсеотсутствовать.

Традиционно усуществующих реализаций ассемблера нет интегрированной среды, подобнойинтегрированным средам Turbo Pascal, Turbo С или Visual C++. Поэтому длявыполнения всех функций по вводу кода программы, ее трансляции, редактированиюи отладке необходимо использовать отдельные служебные программы. Большая частьих входит в состав специализированных пакетов ассемблера.

На рисунке одинприведена общая схема процесса разработки программы на ассемблере. На схемевыделено четыре шага процесса. На первом шаге, когда вводится код программы,можно использовать любой текстовый редактор. Основным требованием к немуявляется то, чтобы он не вставлял посторонних символов (спецсимволовредактирова­нии). Файл должен иметь расширение. asm.

/>

Рис. 1. «Процессразработки программы на ассемблере».

Программы,реализующие остальные шаги схемы, входят в состав программного пакетаассемблера. После написания текста программы на ассемблере наступает следующийэтап — трансляция программы. На этом шаге формируется объектный модуль, которыйвключает в себя представление исходной програм­мы в машинных кодах и некоторуюдругую информацию, необходимую для отладки и компоновки его с другими модулями.Традиционно на рынке ассемблеров для микропроцессоров фирмы Intel имеется двапакета: «Макроассемблер» MASM фирмы Microsoft и Turbo Assembler TASM фирмыBorland.

У этих пакетовмного общего. Пакет макроассемблера фирмы Microsoft (MASM) получил своеназвание потому, что он позволял программисту зада­вать макроопределения (илимакросы), представляющие собой именованные группы команд. Они обладали темсвойством, что их можно было вставлять в программу в любом месте, указав толькоимя группы в месте вставки. Пакет Turbo Assembler (TASM) интересен тем, чтоимеет два режима работы. Один из этих режимов, называемый MASM, поддерживаетвсе основные возможнос­ти макроассемблера MASM. Другой режим, называемый IDEAL,предоставляет более удобный синтаксис написания программ, более эффективноеиспользова­ние памяти при трансляции программы и другие новшества, приближающиекомпилятор ассемблера к компиляторам языков высокого уровня.

В эти пакетывходят трансляторы, компоновщики, отладчики и другие утили­ты для повышенияэффективности процесса разработки программ на ассембле­ре.

В данной курсовойработе для получения объектного модуля исходный файл подвергается трансляциипри помощи про­граммы tasm.exe из пакета TASM.

После устраненияошибок можно приступать к следующему шагу — созданию исполняемого(загрузочного) модуля, или, как еще называют этот процесс, к компоновкепрограммы. Главная цель этого шага — преобразовать код и данные в объектныхфайлах в их перемещаемое выполняемое отображение. Процесс создания исполняемогомодуля разделяют на 2 шага — трансляцию и компоновку. Это сделано намеренно длятого, чтобы можно было объединять вместе несколько модулей (написанных на одномили нескольких языках). Формат объектного файла позволяет, при определенныхусловиях, объединить несколько отдельно оттранслированных исходных модулей водин модуль. При этом в функции компоновщика входит разрешение внешних ссылок(ссылок на процедуры и переменные) в этих модулях. Резуль­татом работыкомпоновщика является создание загрузочного файла с расширением ехе. Послеэтого операционная система может загрузить такой файл  и выполнить его.

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

На этапе отладки,используя описание алгоритма, выполняется контроль правильностифункционирования как отдельных участков кода, так и всей программы в целом. Нодаже успешное окончание отладки еще не является гарантией того, что программабудет работать правильно со всеми возможными исходными данными. Поэтому нужнообязательно провести тестирование программы, то есть проверить ее работу на«пограничных» и заведомо некорректных исходных данных. Для этого составляютсятесты.

Специфика программна ассемблере состоит в том, что они интенсивно работают с аппаратнымиресурсами компьютера. Это обстоятельство заставляет программиста постоянноотслеживать содержимое определенных регистров и областей памяти. Естественно,что человеку трудно следить за этой информацией с большой степенью детализации.Поэтому для локализации логических ошибок в программах используют специальныйтип программного обеспечения — программные отладчики.

Отладчики бываютдвух типов:

·       интегрированные — отладчик реализован в виде интегрированнойсреды типа среды для языков Turbo Pascal, Quick С и т.д.;

·       автономные — отладчик представляет собой отдельную программу.

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

2.СИНТАКСИС АССЕМБЛЕРА

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

Предложенияассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка имеющие смысл длятранслятора. Лексемами являются:

·         идентификаторы — последовательности допустимых символов,использующиеся для обозначения таких объектов программы, как коды операций,имена переменных и названия меток. Правило записи идентификаторов заключается вследующем. Идентификатор может состоять из одного или нескольких символов. Вкачестве символов можно использовать буквы латинского алфавита, цифры инекоторые специальные знаки — _, ?, $, @.

·         цепочки символов — последовательности символов, заключенные водинарные или двойные кавычки;

·         целые числа в одной из следующих систем счисления: двоичной,десятичной, шестнадцатеричной. Отождествление чисел при записи их в программахна ассемблере производится по определенным правилам. Десятичные числа нетребуют для своего отождествления указания каких-либо дополнительных символов.

Практически каждоепредложение содержит описание объекта, над которым или при помощи котороговыполняется некоторое действие. Эти объекты называются операндами. Их можноопределить так: операнды — это объекты (некоторые значения, регистры или ячейкипамяти), на которые действуют инструкции или директивы, либо это объекты,которые определяют или уточняют действие инструкций или директив.

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

Рассмотримклассификацию операндов, поддерживаемых транслятором ассемблера.

Постоянныеили непосредственные операнды —число, строка, имя или вы­ражение, имеющие некоторое фиксированное значение.Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программыв па­мять.

Адресныеоперанды — задают физическое расположениеоперанда в памяти с помощью указания двух составляющих адреса: сегмента исмещений (рис. 2).

/>

Рис. 2. «Синтаксисописания адресных операндов».

Перемещаемыеоперанды — любые символьные имена,представляющие некоторые адреса памяти. Эти адреса могут обозначатьместоположение в памяти некоторой инструкции (если операнд — метка) или данных(если опе­ранд — имя области памяти в сегменте данных). Перемещаемые операндыотличаются от адресных тем, что они не привязаны к конкретному адресуфизической памяти. Сегментная составляющая адреса перемещаемого операнданеизвестна и будет определена после загрузки программы в память для выполнения.

Считчикадреса — специфический вид операнда. Онобозначается знаком $. Специфика этого  операнда в том, что когда трансляторассемблера встречает в  исходной программе этот символ, то он подставляетвместо него текущее значение  счетчика адреса. Значение счетчика адреса, иликак его иногда называют  счетчика размещения, представляет собой смещениетекущей ма­шинной команды относительно начала сегмента кода.

Базовыйи индексный операнды. Этот тип операндовиспользуется для реали­зации косвенной базовой, косвенной индексной адресацииили их комбина­ций и расширений.

Операнды являютсяэлементарными компонентами, из которых формируется часть машинной команды,обозначающая объекты, над которыми выполняется операция. В более общем случаеоперанды могут входить как составные части в более сложные образования,называемые выражениями. Выражения представляют собой комбинации операндов иоператоров, рассматриваемые как единое целое. Результатом вычисления выраженияможет быть адрес некоторой ячейки памяти или некоторое константное (абсолютное)значение. В табл. 2.2 приведены поддерживаемые языком ассемблера операторы иперечислены их приоритеты.

Арифметическиеоператоры. К ним относятся унарные операторы«+» и «-», бинарные «+» и «-», операторы умножения «*», целочисленного деления«/», получения остатка от деления «mod». Эти операторы расположены на уровняхприоритета 6, 7, 8 в табл. 2.1.

Операторысдвига выполняют сдвиг выражения науказанное количество раз­рядов.

Операторысравнения (возвращают значение «истина» или«ложь») предназначены для формирования логических выражений (табл. 5.1). IЛогическое значение «истина» соответствует цифровой единице, а «ложь» —  нулю.

Табл. 2.1.

Операторы сравнения

Оператор Значение eq ИСТИНА, если выражение_1 равно выражение_2 пе ИСТИНА, если выражение_1 не равно выражение_2 It ИСТИНА, если выражение_1 меньше выражение_2 le ИСТИНА, если выражение_1 меньше или равно выражение_2 gt ИСТИНА, если выражение_1 больше выражение_2 ge ИСТИНА, если выражение_1 больше или равно выражение_2 eq ИСТИНА, если выражение_1 равно выражение_2 пе ИСТИНА, если выражение_1 не равно выражение_2

Логическиеоператоры выполняют над выражениямипобитовые операции. Выражения должны быть абсолютными, то есть такими,численное значение которых может быть вычислено транслятором.

Индексныйоператор [ ]. Скобки тоже являютсяоператором, и транслятор их наличие воспринимает, как указание сложить значе­ниевыражение_1 за этими скобками с выражение_2, заключенным в скобки.

Операторпереопределения типа ptr  применяется дляпереопределения или уточнения  имя типа метки или переменной, определяемыхвыражением. Тип может принимать одно из следующих значений: byte, word, dword,qword, tbyte, noar, far. Оператор ptr позволяет непосредственно в командепереопределить тип и выполнить команду.

Операторпереопределения сегмента  :   (двоеточие)заставляет вычислять физический адрес относительно конкретно задаваемойсегментной составляющей: «имя сегментного регистра», «имя сегмента» изсоответствующей директивы SEGMENT или «имя группы».

Операторименования типа структуры. (точка) также заставляет транслятор производитьопределенные вычисления

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

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

3. ОПИСАНИЕАЛГОРИТМА

Алгоритм реализуетвычисление CRC8 делением заданного массива данных на образующий полином x8+x5+x4+1. Деление выполнено последовательным вычитанием по модулю 2полинома из исходной последовательности.

Для этогоорганизован цикл по словам исходной последовательности и цикл по разрядногосдвига внутри слова. Поскольку удобнее просматривать массив в порядкеувеличения адреса (от младшего к старшему), процедура реализует зеркальныйалгоритм.

Подробнее о томкак выполняется деление при вычислении CRC смотри в прилагаемыхисточниках.

Для процедурывычисления исходные данные передаются через регистры. Сегментный регистр ES должен содержатьсегмент в котором расположен массив, регистр DX – смещение начала массива внутри сегмента, BX – длина массива.Результат накапливается в аккумуляторе AL.

Перед началомвычислений инициируем AX значением FFFFh. В регистр CX заносим длину массива и умножаем её на 8. Таким образом этотрегистр хранит количество разрядов в массиве и используется как счётчик цикловкомандой loop. Дополнять исходную последовательность (проверяемый массив)нулями нет необходимости, т.к. количество разрядов кратно степени образующегомногочлена.

Смещение переносимв регистр DI.

В BX заносим первое словомассива.

Проверяем младшийразряд BX. Если он равен нулю – выполняем сдвиг слова на один разрядвправо,  если нет – выполняем сложение с образующим многочленом по модулю 2, азатем выполняем сдвиг.

Сдвиг по разрядамвыполняется следующим образом. В DX хранится количество сдвигов оставшееся до конца слова(удобнее подсчитывать не количество выполненных сдвигов, а от количестваразрядов в слове до 0). Если в DX – 0, то нужно в DX записать 8, а в BX загрузить следующее слово массива, иначе – просто сдвигаем BX вправо на разряд и уменьшаем DX на 1.

Повторяемсуммирование.

После окончанияпроцедуры аккумулятор AX содержит вычисленное для массива значение CRC8.

Для сохранениярезультата его переносим в переменную result.

Для проверкицелостности массива нужно повторить вычисление контрольной суммы и сравнить созначением в result.

Блок-схемаалгоритма приведена  в приложении 1.

4. ОПИСАНИЕПРОГРАММЫ

Алгоритмопределения CRC реализован в процедуре CalcCRC. Перед вызовом этойпроцедуры необходимо в регистры записать начальные данные — сегментный регистр ES должен содержатьсегмент в котором расположен массив, регистр DX – смещение начала массива внутри сегмента, BX – длина массива.

Программа выполняет следующие операции по выбору пользователя: вычисление CRC массива и записьрезультата в переменную, проверка целостности массива – повторное вычисление CRC и сравнениевычисленного значения с записанным, искажение массива – обратимое изменениеодного бита проверочного массива.

Для вычисления CRC, вызывается процедура CalcCRC, а результатвыполнения сохраняется в переменной result.

При проверкецелостности, вызывается процедура CalcCRC, а результат выполнения сравнивается с сохранённым в переменнойresult. В случае несовпадения, выводится сообщение об ошибке. Присовпадении значений (целостность данных не нарушена) сообщение не выводится ипользователь возвращается в главное меню.

Искажение массиваиспользуется для тестирования программы и демонстрации работы.

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

ПРИЛОЖЕНИЕ  1

Блок-схемаалгоритма

/>

ПРИЛОЖЕНИЕ  2

MODEL SMALL

;*****************************************************************************

;     Сегмент стека

;*****************************************************************************

_Stack      SEGMENT     WORD  'STACK'    

      DB    200h  DUP (?)

_Stack      ENDS

;*****************************************************************************

;     Сегмент тестового массива

;*****************************************************************************

DataSeg     SEGMENT     WORD 'DATA'

TestTab     DB    32 DUP (    \

                  00h, 01h, 02h, 03h, 04h, 05h, 06h,07h, \

                  08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh,0Fh,  \

                  00h, 01h, 02h, 03h, 04h, 05h, 06h,07h, \

                  08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh   \

                  )

DataSeg     ENDS

;*****************************************************************************

;     Сегмент переменных

;*****************************************************************************

_Data SEGMENT     WORD 'DATA'

;*****************************************************************************

FSelMsg     DB    13,10,'Выберите действие:',13,10, \

            13,10,'1-Определить CRC',13,10,          \

            '2-Проверить массив',13,10,        \

            '3-Исказить массив',13,10,         \

            '4-Выход',13,10,        \

            '$'

ByeStr      DB    13,10,'Для продолжения нажмите любую клавишу.$'

ErrorString DB 13,10,'Ошибка ввода',13,10,'$'

ErrorResult DB 13,10,'Данные искажены. CRC8 нарушена.',13,10,'$'

;*****************************************************************************

BegSeg      DW    (?)  ; Сегмент проверочного массива

BegOffs     DW    (?)  ; Начало проверочного массива

Result      DW    (?)  ; Результат вычисления

FuncNum     DB    (?)  ; Выбранная операция

_Data ENDS

;*****************************************************************************

;     Сегмент программы

;*****************************************************************************

      .CODE

;*****************************************************************************

      call  cls              ; Очистка экрана

      call  SetDATSeg        ; Загрузка адреса сегмента переменных

      call  SetArrSeg              ; Установка указателя сегмента массива

     ; Главное меню

Mnu:        call  SelectFunction         ; Выбор операции

      call  cls              ; Очистка экрана

      mov   AL,FuncNum

      ;*******************************

Mnu1: cmp   AL,1             ; Определение чётности

      jne   Mnu2

     ; Установка параметров

      mov   DX,OFFSET TestTab; Смещение начала массива

      mov   BX,30            ; Размер проверяемого блока данных

      ;call TestOdd

      call  CalcCRC

      mov   Result,AX        ; Сохранение результата

      ;*******************************

Mnu2: cmp   AL,2             ; Определить чётность и сравнить с пред.

      jne   Mnu3

      mov   DX,OFFSET TestTab; Смещение начала массива

      mov   BX,30            ; Размер блока данных

      call  CalcCRC

      cmp   Result,AX

      je    Mnu2End

     ; Результат не совпал. Данные искажены. Выдать сообщение об ошибке

      mov   DX,OFFSET ErrorResult

      mov   AH,9h

      int   21h              ; Вывод сообщения обошибке

      mov   DX,OFFSET ByeStr ; Вывод приглашения

      mov   AH,9h

      int   21h

      mov   AH,0Ch     

      mov   AL,01h     

      int   21h              ; Ожидание нажатия любойклавиши

Mnu2End:

      call  cls

      jmp   Mnu

      ;*******************************

Mnu3: cmp   AL,3             ; Искажение масива (первый байт)

      jne   Mnu4

      mov   DI,OFFSET TestTab

      mov   AX,ES:[DI]

      xor   AX,1                   ; Инвертируем младшийбит

      mov   ES:[DI],AX

      ;*******************************

Mnu4: cmp   AL,4             ; Выход из программы

      jne   Mnu

      ;*******************************

      jmp   Exit

     ; Завершение программы

;Exit:

     ; Приостанов перед выходом

      mov   DX,OFFSET ByeStr  ;? Нажмите клавишу??

      mov   AH,9h

      int   21h

      mov   AH,0Ch     

      mov   AL,01h     

      int   21h  

Exit:; Выход

      mov   AH,4Ch

      int   21h

;*****************************************************************************

; Печать новой строки

NewStr:          

      mov   AH,02h

      mov   DL,0Dh

      int   21h

      mov   DL,0Ah

      int   21h

      ret

;*****************************************************************************

      include     cls.prc

;*****************************************************************************

; Главное меню

SelectFunction:

      ;1.1.Вывод строки меню

      mov   DX,OFFSET FSelMsg

      mov   AH,9h

      int   21h

      ;1.2.Выбор функции

      mov   FuncNum,0

      call  input10                ; Считываемномер пункта меню

      mov   FuncNum,AL       ; Сохраняем номер выбранной функции

ExitSF:     ret

;*****************************************************************************

; Подпрограмма ввода числа

input10:

      push  BX               ; Сохраняем регистры

      push  DX

      push  CX

      mov   DX,0             ; Обнуляем регистр хранения результата

InputChar:

      clc

      mov   AH,0Ch

      mov   AL,1

      int   21h              ; Считываем символ с эхом

      cmp   AL,13d

      je    ExitI10                ; Если его код 13? конец ввода

      cmp   AL,'0'

      jb    ErrInput         ; Если код меньше кода символа 0  ошибкаввода

      cmp   AL,'9'

      jg    ErrInput         ; Если код больше кода символа 9  ошибкаввода

      clc

      sub   AX,30h                 ; Получаем из кода символа число

      mov   CX,0

      mov   CL,AL

      mov   AX,DX

      mov   BX,10

      mul   BX               ; Умножаем на 10 уженакопленный результат

      add   AX,CX            ; Прибавляем считанное число

      mov   DX,AX            ; Сохраняем результат

      jmp   InputChar

ErrInput:

      Stc                    ; В случае ошибки ввода  устанавливаем флаг

ExitI10:

      mov   AX,DX            ; Переносим результат в регистр возврата

      pop   CX

      pop   DX

      pop   BX               ; Восстанавливаем регистры

      ret

;*****************************************************************************

; Установка указателя на сегмент переменных

SetDATSeg:

      push  AX

      mov   AX,_Data

      mov   DS,AX

      pop   AX

      ret

;*****************************************************************************

; Установка указателя на проверочный массив

SetArrSeg   proc

      push  AX

      mov   AX,DataSeg

      mov   ES,AX

      pop   AX

      ret

SetArrSeg   endp

;****************************************************************************

;     Процедура вычисления CRC16

;ES — сегмент массива

;DX — адрес начала массива

;BX — длина блока данных

;AX — результат вычислений

;****************************************************************************

CalcCRC     proc 

     

      push  CX                      ;\

      push  BX                      ;- сохранение регистров

      push  DI                      ;/

      push  DX

      mov   DI,DX            ; Загрузка индекса начала массива

      mov   DX,8

      mov   CX,BX                  ; Установка счётчика цикла

      shl   CX,1              ;\

      shl   CX,1              ;- CX=CX*8

      shl   CX,1              ;/

      mov   AX,65535         ; Очистка регистра результата

      mov   BX,ES:[DI]

CRNext:     loop  CRNextTest       ; Цикл по словам массива

      pop   DX

      pop   DI                ;\

      pop   BX                      ;-восстановление регистров

      pop   CX                      ;/

      ret

     

CRNextTest:

      push  AX

      mov   AX,BX

      and   AX,1b

      jz    Shift

      pop   AX

      xor   AL,31h

      push  AX

Shift:      mov   AX,DX

      jz    NewWord

      shr   BX,1

      dec   DX

      jmp   EndShift

NewWord:

      mov   DX,8

      inc   DI

      mov   BX,ES:[DI]

EndShift:

      pop   AX

      jmp   CRNext

CalcCRC     endp

;*****************************************************************************

      END

;*****************************************************************************               

ЗАКЛЮЧЕНИЕ

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

В данной курсовойработе рассмотрены основные этапы программирования на ассемблере, реализованалгоритм выполнения поставленной задачи, а также выполнена трансляция кода висполняемый файл.

СПИСОК ЛИТЕРАТУРЫ:

1.  Финогенов К.Г. Основы языка Ассемблера. – М.: Радио исвязь,2000.

2.  Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.

3.  Юров В. Assembler. Практикум. – СПб.: Питер, 2001.

4.  Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.:Питер, 2000.

www.ronl.ru

Реферат - Ассемблер - Информатика, программирование

Волжский университет имениВ.Н.Татищева

Факультет “Информатика ителекоммуникации”

Кафедра “Информатика и системыуправления”

КУРСОВАЯ РАБОТА

по дисциплине: “Организация ЭВМ ”

Тема: “Ассемблер”

Выполнил: студент гр. ИС-311

Руководитель:

Тольятти

Содержание курсовой работы:

 

1.        Описание и схемаалгоритма.

2.        Областьприменения.

3.        Листинг программыс комментариями.

4.        Списоклитературы.

1. Описание и схема алгоритма

Начало программы начинается с распределения памяти под код программы подданные и под стек. Прописав строку ModelSmall выделяется по 64кБ под данные и под код. В задании нам необходимоработать с 32-х битными переменными для чего прописываем строку .386.

Определившись с основными моментами начинаем ввод переменных. Переменнойявляется x.

Ввод переменной x и обработка осуществляется в несколько этапов.Вначале вводится код числа стандартным прерыванием int21 функцией Ah, замет берётся каждый символ и преобразуется вдесятичное значение и осуществляется определение десятков или единицсоответственно. В результате получаем введённое нами десятичное число.

Следующим этапом является вычисление полинома по формуле у=2* x/>-6y- 4. Во-первых возводим в квадрат “x”, затем умножаем на 2. Потом суммируем полученные значения ипомещаем в переменную у, которая и является ответом данной задачи.

Завершающей стадией программы являются вывод переменной у и завершениепрограммы. Вывод переменной осуществляется функцией outword, которая содержится в подключаемоммодуле io.asm. Подключение данного модуля осуществляется командной include прописываемая до кода программы.Завершение программы осуществляется стандартным способом по стандартному DOS-кому прерыванию int21 функцией 4Сh.

/>

Рис. 1. Схема алгоритма.

 

Модуль ввода-вывода Io.asm.

Вначале рассмотрим схему хранения операций ввода-вывода (ВВ) иподключения их к программам:

/>

Часть операций ввода-вывода реализована в виде процедур, описания которыхсобраны в отдельном модуле, хранящемся в файле с именем ioproc.asm (текст модуля приведён ниже). Предполагается, чтоэтот модуль заранее оттранслирован и в виде объектного модуля записан в файл сименем ioproc.obj.

Изменения стека во время прогона программы

Стек в данной программе при выводе переменной у нам необходимобыло освободить 6 байт стека для вывода числа.

SP–указатель стека. SS – стек.

Приведём пошаговое изменение стека:

SP: 00F0 SS: 00F2 0000

SS: 00F0 3530

SP: 00F2 SS: 00F4 13BA

SS: 00F2 0000

SP: 0F4 SS: 00F6 0000

SS: 00F4 13BA

SP: 00F6 SS: 00F8 00C9

SS: 00F6 0000

SP: 00F8 SS: 00FA 1645

SS: 00F8 00C9

SS: 00FE 0924

SP: 0100 SS: 0102 02B4

SS: 0100 5052

2. Область применения.

Программа применяется для расчета полинома у=2* x/>-6y- 4. Программа имеет ограничения в применении, потому что вней применяется расчет одного значения и по одному алгоритму.

3. Листингпрограммы:

model small

include io.asm

.data

vvx db 10,13,'Введите x: ','$'

vvy db 10,13,'Введите y: ','$'

otvet db 10,13,'Ответ: ','$'

x db 0

two dd 2

four dd 4

six dd 6

z dw 0,0

.stack 256

.386

.code

main:

;*********-начало программы-********************************

 mov dx,@data; начальный адрес в сегмент данных

 mov ds,dx

;*********-Вывод строки-*************************************

 mov dx,offset vvx

 mov ah,9h; Вывод строки 'Введите x'

 int 21h

;********-Ввод числа-****************************************

 

 mov ah,1h

 int 21h

 sub al,30h

 push ax

;*********-Вывод строки-*************************************

 mov dx,offset vvy

 mov ah,9h; Вывод строки 'Введите y'

 int 21h

;********-Ввод числа-****************************************

 mov ah,1h

 int 21h

 sub al,30h

 push ax

;**********-Расчёт полинома-***********************************

 pop ax

 xor ah,ah

 mov bx,word ptr (six+2)

 mul bx       ;dx,ax=y*6

 mov cx,dx

 mov bx,ax

 pop ax

 xor ah,ah

 mov x,al

 mul x ;ax=al*al

 ;xor cx,cx

 mov dx,word ptr (two+2)

 mul dx ;dx,ax:=2*al

 sub ax,bx  

 sbb dx,cx

 ; Результат DX,AX

 xor cx,cx

 mov bx,word ptr (four+2) ;dx = Результат

 sub ax,bx  

 sbb dx,cx

 ; РезультатDX,AX

 mov z,dx

 mov z+2,ax

;**********-Завершение работы программы-**********************

 mov dx,offset otvet; Вывод сообщения «Ответ»

 mov ah,9h

 int 21h

 outword z; Процедура вывода

 outwordz+2

 mov ax,4c00h

 int 21h

 end main

4.Список литературы:

 

1.        ЕфремовВ.Д., Мелехин В.Ф., Дурандин К.П. и др. Вычислительные машины и системы.Учебник для вузов – 2М.: Высшая школа, 1994.

2.        ЛарионовА.М., Майоров С.А., Новиков Г.И. Вычислительные комплексы, системы, сети.//Учебник для вузов. – Л.: Энергоатомиздат, 1987.

3.        ГригорьевВ.Л. Микропроцессор i486. Архитектураи программирование. –М.: БИНОМ, 1993

www.ronl.ru


Смотрите также