Учебная работа. Курсовая работа: Ассемблер 2

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (4 оценок, среднее: 4,75 из 5)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Ассемблер 2

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

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

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

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

студент 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) и ограниченный состав установок. Так как программирова­ние на языке ассемблера впрямую затрагивает аппаратные способности процессора, до этого всего, следует узнать, в которой степени про­граммист может применять новейшие способности процессоров в собственных программках, и какие трудности программной несовместимости мо­гут при всем этом появиться.

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

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

В предстоящем на замену микропроцессору 80286 пришли модели 80386, i486 и, в конце концов, разные варианты микропроцессора Pentium. Они все могут ра­ботать и в настоящем, и в защищенном режимах. Хотя любая последующая модель была существенно совершеннее предшествующей (а именно, практически на два порядка возросла скорость работы микропроцессора, начиная с модели 80386 микропроцессор стал 32-разрядным, а в микропроцессорах Pentium реализован даже 64-разрядный обмен данными с системной шиной), но исходя из убеждений программера все эти микропроцессоры очень идентичны. Главным их ка­чеством является наличие 2-ух режимов работы — настоящего и защищен­ного. Строго говоря, в современных микропроцессорах реализован к тому же 3-ий режим — виртуального 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 шага — трансляцию и компоновку. Это изготовлено преднамеренно для того, чтоб можно было соединять воединыжды совместно несколько модулей (написанных на одном либо нескольких языках). формат объектного файла дозволяет, при определенных критериях, соединить несколько раздельно оттранслированных начальных модулей в один модуль. При всем этом в функции компоновщика заходит разрешение наружных ссылок (ссылок на процедуры и переменные) в этих модулях. Резуль­татом работы компоновщика является создание загрузочного файла с расширением ехе. Опосля этого операционная система может загрузить таковой файл и выполнить его.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


— число, строчка, имя либо вы­ражение, имеющие некое фиксированное


— задают физическое размещение операнда в памяти при помощи указания 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, заключенным в скобки.


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


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

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



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


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


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

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

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

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

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

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

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

В BX заносим 1-ое слово массива.

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

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

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

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

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

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

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


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

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

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

Для вычисления 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 ;Искажение масива (1-ый б)

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.

]]>