Реализация алгоритма Cyclic Redundancy Code на языке ассемблера

Основные этапы программирования на ассемблере. Реализация алгоритма Cyclic Redundancy Code. Методы проверки массива данных. Трансляция кода в исполняемый файл. Контроль на четность массива данных, хранящегося в некоторой области памяти и программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 10.01.2017
Размер файла 712,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http: //www. allbest. ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФГБОУ ВО «РОСТОВСКИЙ ГОСУДАРСТВЕННЫЙ ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ (РИНХ)»

КАФЕДРА Информационных технологий и защиты информации

КУРСОВОЙ ПРОЕКТ

По дисциплине: «Низкоуровневое программирование»

На тему: «Реализация алгоритма Cyclic Redundancy Code на языке ассемблера»

Автор проекта:

студент гр. 311-ПРИZS Щетинин А.Б.

Руководитель проекта: Щербаков С.М.

Ростов-на-Дону 2016

Реферат

Курсовой проект: 25 с., 5 рис., 11 библ.зап., 2 прил.

СИСТЕМА WINDOWS, АЛГОРИТМ ОПРЕДЕЛЕНИЯ CRC, ПРОЦЕДУРА CalcCRC, ОПЕРАНДЫ.

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

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

Содержание

Реферат

  • Введение
  • 1. Описание алгоритма
  • 2. Выбор программного средства реализации
  • 3. Алгоритм программы
  • 4. Описание программы
  • Заключение
  • Список литературы
  • Приложения

Введение

Целостность информации контролируется с помощью техники, которая называется полиномиальными кодами или циклическим избыточным кодом (Cyclic Redundancy Code) или CRC кодом.

CRC обеспечивает обнаружение ошибок при передаче информации с вероятностью до 99%.

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

Задачи работы:

1.описать алгоритм;

2. выбрать программное средство реализации;

3. описать программы.

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

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

ассемблер программирование код массив

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

Действия источника следующие.

1. Выбрать полином Р, в результате автоматически становится известной его степень N.

2. Добавить к исходной двоичной последовательности N нулевых битов. Это добавление делается для гарантированной обработки всех битов исходной последовательности.

3. Выполнить деление дополненной N нулями исходной строки S на полином Р по правилам CRC-арифметики. Запомнить остаток, который и будет являться CRC.

4. Сформировать окончательное сообщение, которое будет состоять из двух частей: собственно сообщения и добавленного в его конец значения CRC.

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

Из рисунка видно, что в начале вычисления исходная последовательность 1101001110010110100 дополняется нулями в количестве, равном степени полинома (Р=1011 - степень полинома N=3): 1101001110010110100+000. При выполнении CRC-деления эти дополнительные биты гарантируют, что все биты исходной последовательности примут участие в процессе формирования значения CRC. Результирующая последовательность получается равной исходной последовательности, дополненной значением CRC: 1101001110010110100+011. Заметим, что длина присоединяемого к исходной последовательности значения CRC должна быть равна степени полинома, даже если CRC, как в нашем случае, имеет ведущие нули. Это очень важный момент, понимание которого является ключом к пониманию сути процессов, происходящих на стороне приемника при получении и определении целостности исходного сообщения. Действия алгоритма для приемника просты -- выполнить деление полученной последовательности на полином. При этом для выполнения деления нет необходимости дополнять исходную последовательность нулями, тем более что на практике соблюдение этого условия крайне неудобно. Приемник попросту выполняет CRC-деление полученной исходной строки (дополненной в конце

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

Рисунок 1.1 Схема формирования выходного сообщения из исходного с использованием CRC-алгоритма

Описанный выше алгоритм вычисления значения CRC называется прямым и чаще всего реализуется аппаратно. Но, тем не менее, для совершенствования навыков программирования на ассемблере составим реализующий его пример программы. Хотя эффективность этой программы не слишком высока, у нее есть две учебные цели:

показать в виде программной реализации суть алгоритма вычисления CRC и самого CRC-деления;

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

Для компьютерной реализации алгоритмов вычисления CRC удобно выбирать полиномы со степенями, кратными 8 (то есть размерности регистров) -- 8, j5, 24, 32 или даже 64. В этом случае можно подобрать команды из системы команд микропроцессора, наиболее оптимально реализующие алгоритмы вычисления CRC. В качестве полинома выберем один из рекомендуемых полиномов (см. ниже) -- 4003. И еще одно важное замечание -- степень полинома определяет размерность регистра, используемого в алгоритме, при этом считается, что старший (всегда единичный) бит полинома находится сразу за левой границей регистра. В этих условиях программа реализации прямого алгоритма вычисления CRC функционирует следующим образом (для лучшего понимания в процессе разбора алгоритма см. рис. 1.2). В регистр побитно вдвигаются биты исходной строки. Это происходит до тех пор, пока при очередном сдвиге слева появится единичный бит. В этом случае все содержимое регистра подвергается операции XOR со значением полинома без старшего бита. Далее процесс сдвига и анализа выдвигаемого бита продолжается до тех пор, пока не будет выдвинут очередной единичный бит, в результате чего опять между регистром и полиномом выполняется операция XOR, и т. д. После того как последний бит вдвинут в регистр, в него вдвигается количество нулевых битов, равное степени полинома. Этим, как мы не раз уже отмечали, достигается участие всех бит исходной битовой строки в формировании значения CRC. В результате в регистре остается значение CRC, которое необходимо добавить к исходной строке и передать приемнику.

jnc m5; старшие разряды не равны - выполняем сдвиг (частное нас не интересует); старшие разряды равны - выполняем XOR:

хог eax.ebx;eax(31..16) XOR pollnom т5: loop m4

В результате вычисления CRC символьной последовательности "6476с8" получим CRC * 35dah.

Рисунок 1.2 Схема вычисления значения CRC прямым алгоритмом

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

prg09_02.asm - программа демонстрации прямого алгоритма вычисления CRC; (сторона-приемник). Очевидный недостаток прямого метода -- большое количество операций сдвига, исключающих операций ИЛИ (XOR) и операций условного перехода, которые выполняются для каждого бита исходного сообщения. Поэтому на практике используется другой способ расчета CRC, называемый табличным.

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

data

исходная битовая последовательность в символах

bit_string db "6476c8",35h.0dah

1en_bit_stri ng=$-bi t_stri ng

adr_bit_string dd bit_string

polinomdw 4003h

.code

main:

exit: :выход из программы

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

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

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

Смещение записываем в регистр DI.

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

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

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

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

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

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

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

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

2. Выбор программного средства реализации

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 2.1 Процесс разработки программы на ассемблере

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

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

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

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

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

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

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

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

Отладчики выделяют двух типов:[6, с.752]

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

ѕ автономные -- отладчик представлен отдельной программой.

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

3. Алгоритм программы

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

Из этой схемы видно, что для текущего содержимого старшей половины регистра ЕАХ можно прогнозировать, как будет изменяться содержимое его битов по мере их сдвига. Для этого достаточно подвергнуть анализу его биты начиная с самого старшего. Допустим, что старшие 8 бит ЕАХ равны а7 а6 а5 а4 а3 а2 а, а,,. При следующем сдвиге (см. рис. 3.1) прямой алгоритм определяет, будет ли произведена операция XOR операнда с полиномом b7 b6 b5 b4 Ь3 b2 b, bо в ВХ (а7=1) или нет (а7=0). Если выдвинутый бит был равен 1, то прежнее содержимое старшей половины регистра ЕАХ будет подвергнуто операции XOR с соответствующими битами полинома. В обратном случае, если выдвинутый бит был равен 0, значения битов будут не изменены, а просто сдвинуты влево на одни разряд. В принципе, имея большое желание, можно рассчитать заранее, каким будет содержимое к-го бита в к-й итерации сдвига. К примеру, значение нового старшего бита, определяющего действия алгоритма в следующей итерации, можно рассчитать по содержимому двух старших битов старшего байта исходного операнда -- а6 XOR а7 AND b7, где b7 -- старший бит полинома (всегда равный единице).

Теперь остановимся для того, чтобы рассмотреть и обсудить очередную схему (рис. 3.1.).

Рисунок 3.1 Влияние на регистр ЕАХ серии операций XOR при вычислении CRC

Из рассуждений выше следует, что если взять для рассмотрения старший байт операнда, то по его содержимому можно однозначно предположить, сколько операций XOR и когда будет выполнено (см. рисунок). Обозначим старшую половину регистра ЕАХ как переменную А, а операнды со значениями полинома, объединяемые с А при единичном состоянии очередного выдвигаемого слева бита, обозначим соответственно как В, С, D

В = С = D

Тогда формирование результата Е можно представить формулой:

Е-((А [|сдвиги| XOR В) [|сдвиги| XOR С) |сдвиги| XOR D

Здесь | сдвиги | представляют собой значение от 0 до 7 и определяются текущим содержимым старшего байта операнда (регистра ЕАХ). Благодаря ассоциативному свойству операции XOR тот же самый результат можно получить, если предварительно выполнить операцию XOR над полиномами В, С, D с соответствующими значениями сдвигов, а затем результат объединить по XOR с А:

F: = |сдвиги| XOR ( В |сдвиги| XOR С |сдвиги| XOR D) Е:= A XOR F

Из этих рассуждений следуют важные выводы:

· величина F является совершенно точно предсказуемой по содержимому старшего байта операнда;

· если величина F определяется содержимым старшего байта операнда и собственно значением полинома, то существует всего 256 возможных значений этой величины (по количеству значений, представимых беззнаковым байтом);

· исходя из первых двух положений величина F не зависит от значения операнда и может быть рассчитана заранее, при этом результаты ее расчетов можно свести в таблицу (!).

Название табличного алгоритма основано на расчете CRC. Теперь со знанием сути дела приведем его общее описание (рис. 3.2). В качестве основы для рассуждений по-прежнему используем программу прямого вычисления значения CRC и соответствующую схему (см. рис. 3.3).

Рисунок 3.2 Общая схема табличного алгоритма

На схеме, показанной на рисунке, цифрами обозначена последовательность шагов табличного алгоритма. Шаги 1 и 2 выполняются одновременно и означают, что старший байт из регистра ЕАХ выдвигается в переменную R, а младший байт этого регистра заполняется очередным байтом исходной последовательности. Значение переменной R используется на шаге 3 в качестве индекса в таблице TABL_F для извлечения 16-битного значения, которое на шаге 4 будет объединено операцией XOR с содержимым старших 16 битов регистра ЕАХ. Таким образом, в отличие от прямого алгоритма процесс преобразования вырастает до уровня байтов и содержит три операции: сдвига, доступа к таблице для извлечения нужного значения и операции XOR извлеченного значения с содержимым старшей половины ЕАХ. По окончании процесса в старшей половине ЕАХ будет содержаться значение CRC. Сообщение по-прежнему должно быть выровненным, то есть дополненным количеством битов, равным степени полинома, или для данного случая -- 16. Для практических приложений это крайне неудобно, и решение этой проблемы будет показано чуть ниже. Пока же разработаем программу вычисления содержимого таблицы на основе полинома 1021h степени 16.

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

Прямой табличный алгоритм CRC16

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

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

Рисунок 3.3 Схема вычислений CRC с использованием прямого табличного алгоритма

На схеме вычислений CRC с использованием прямого табличного алгоритма цифрами обозначена последовательность шагов вычисления CRC.

1. Выдвижение старшего байта регистра АХ в байтовую ячейку.

2. Выполнение операции XOR над выдвинутым на шаге 1 в байтовую ячейку старшим байтом регистра АХ и очередным байтом исходной строки.

3. Полученное на шаге 2 значение используется в качестве индекса для доступа к элементу CRC-таблицы.

4. Извлеченное из CRC-таблицы значение объединяется по XOR со значением в регистре АХ.

5. Результат выполнения на шаге 4 операции XOR помещается обратно в регистр АХ.

После обработки последнего байта исходной строки регистр АХ содержит значение CRC.

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

· переход от цикла по всем битам к циклу по большим порциям данных -- байтам, словам и т. д.;

· повышение разрядности порождающего полинома;

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

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

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

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

· по способу прохода байтов через регистр -- способ может быть косвенным или прямым;

· по тому, производится ли обращение конечного результата;

· по конечному значению, с которым производится объединение по XOR результата вычисления CRC.

После появления 32-разрядных микропроцессоров наибольшей популярностью стали пользоваться 32-разрядные алгоритмы вычисления CRC. В различных источниках рассматривают два типа таких алгоритмов -- прямой и зеркальный.

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

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

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

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

Целостность проверяется вызовом процедуры CalcCRC, а результатом выполнения является сопоставление с сохранённым в переменной result. Если они не совпадают, тогда выводится сообщение об ошибке, если же значения совпадают, то целостность данных не нарушена и сообщение не выводится и пользователь возвращается в главное меню[5, с.1280].

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

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

Заключение

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

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

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

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

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

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

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

5. Снетков Н.Н. Имитационное моделирование экономических процессов. Учебно-методическое пособие / М.: Евразийский открытый институт, 2008. - 227 с.

6. Власов С. А., Девятков В. В. Имитационное моделирование в России: прошлое, настоящее, будущее//Автоматизация в промышленности. М.: Мир, 2010 - 630 с.

7. Строгалев В.П., Толкачева И.О. Имитационное моделирование. Учебное пособие / М.: МГТУ им. Н.Э.Баумана 2008 - 17 с.

8. Волков М.А., Сорочкин А.С., Лазурик В.М., Лазурик В.Т. Разработка программ генераторов псевдослучайных чисел: Методическое пособие по курсовому проектированию для студентов компьютерных специальностей / Х.: ХНУ им. В.Н.Каразина, 2009. - 55 с.

9. Конев И.Р., Беляев А.В. Информационная безопасность предприятия. - СПб.: БХВ-Петербург, 2013. - 752 с.:ил.

10. Лекции Некучаевой Н.А. по дисциплине “Информационная безопасность и защита информации”, 2015г.

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

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

13. Юров В. Assembler. Практикум. - СПб.: Питер, 2011.

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

Приложение A

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

Приложение Б

Алгоритм вычисления CRC

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

Размещено на Аllbest.ru


Подобные документы

  • Разработка на языке ассемблера алгоритма контроля, на циклический CRC-код, массива данных хранящегося в некоторой области памяти. Сохранение кода для последующей периодической проверки массива данных. Сообщение об искажении данных. Описание алгоритма.

    курсовая работа [453,0 K], добавлен 27.02.2009

  • Изучение основных этапов программирования на ассемблере, который является символическим представлением машинного языка, то есть каждой машинной команде соответствует команда ассемблера. Реализация алгоритма выполнения программы для просмотра bmp файлов.

    курсовая работа [248,0 K], добавлен 25.12.2012

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

    курсовая работа [44,0 K], добавлен 09.11.2014

  • Developed the principles that a corpus of texts containing code-mixing should have and built a working prototype of Udmurt/Russian Code-Mixing Corpus. Discussed different approaches to studying code-mixing and various classifications of code-mixing.

    дипломная работа [1,7 M], добавлен 30.12.2015

  • Методы решения задачи о ранце. Алгоритм неявного лексикографического перебора. Разработка структуры данных, реализация алгоритма с её использованием, программная реализация. Проведение тестовой проверки. Входной и выходной файл, листинг программы.

    курсовая работа [408,8 K], добавлен 22.10.2012

  • Использование класса статических массивов структур и базы данных "ODER" при создании программы на языке С++. Основные формы выдачи результатов. Технические и программные средства. Тесты для проверки работоспособности алгоритма создания программы.

    курсовая работа [1,1 M], добавлен 17.03.2015

  • Особенности разработки программ на языке Turbo Pascal на примере программы обработки массива данных с построением диаграммы. Функции программы и основные требования к ней. Состав входных и выходных данных. Использование предметной области "Садовод".

    курсовая работа [789,1 K], добавлен 13.03.2013

  • Описание алгоритма решения задачи графическим способом. Вывод элементов массива. Описание блоков укрупненной схемы алгоритма на языке Pascal. Листинг программы, а также ее тестирование. Результат выполнения c помощью ввода различных входных данных.

    контрольная работа [150,4 K], добавлен 03.05.2014

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

    курсовая работа [115,5 K], добавлен 22.05.2010

  • Вычисление суммы положительных элементов массива. Упорядочивание элементов массива по убыванию. Решение задачи с помощью алгоритма, реализованного в среде Microsoft Visual 2008 Express. Реализация и тестирование программы. Выполнение трассировки функций.

    практическая работа [146,3 K], добавлен 23.01.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.