Учебная работа. Курсовая работа: Ассемблер 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.
]]>