Ассемблер

Автор работы: Пользователь скрыл имя, 17 Октября 2013 в 21:20, реферат

Описание работы

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

Содержание работы

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

Файлы: 1 файл

Реферат на тему.docx

— 80.45 Кб (Скачать файл)

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Табл. 2.1.

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

Оператор

Значение

eq

ИСТИНА, если выражение_1 равно  выражение_2

пе

ИСТИНА, если выражение_1 не равно  выражение_2

It

ИСТИНА, если выражение_1 меньше выражение_2

le

ИСТИНА, если выражение_1 меньше или равно выражение_2

gt

ИСТИНА, если выражение_1 больше выражение_2

ge

ИСТИНА, если выражение_1 больше или равно выражение_2

eq

ИСТИНА, если выражение_1 равно  выражение_2

пе

ИСТИНА, если выражение_1 не равно  выражение_2


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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

ЗАКЛЮЧЕНИЕ

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

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

 

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

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

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

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

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


Информация о работе Ассемблер