Автор: Пользователь скрыл имя, 25 Января 2012 в 10:10, курсовая работа
В курсовой работе в соответствии с заданием на проектирование решается задача на языке ассемблера для CPU i8086, в которой требуется вычислить значение логической формулы F=(X7&X6&X1) V (X6&X4&X2X1&X0 ) V (X7&X6&X3&X1) логическими переменными которой являются значения массива из 8 байт, и размещающей результат в оперативной памяти.
Описание пошаговой реализации алгоритма решения задачи в виде последовательности арифметических, логических и других действий, которые необходимо проделать для реализации принятого метода решения. Реализация задачи предполагает создание исходного, объектного и загрузочного модулей, а также подробное описание каждого действия по написанию программы.
Введение 4
1 Постановка задачи 6
2 Анализ задачи 8
2.1 Определение входной и выходной информации 8
2.2 Выбор модели памяти 8
2.3 Выбор режимов адресации 9
2.4 Разработка блок-схемы программы 12
3 Реализация 13
3.1 Описание этапов создания программы 13
3.1.1 Описание исходного модуля 16
3.1.2 Трансляция программы 18
3.2 Характеристика полученного файла листинга 20
3.3 Характеристика полученного загрузочного модуля 22
3.4 Анализ команд программы 22
3.5 Анализ команд jmp, jl, jg и loop 24
3.6 Анализ дампа памяти (сегменты данных, кода и стека) 27
4 Тестирование и отладка программы 29
4.1 Отладка программы 29
4.2 Тестирование программы 29
Заключение 33
Литература 34
Приложение А 35
Приложение Б 36
Приложение В 38
Приложение Г 39
Содержание
В курсовой работе в соответствии с заданием на проектирование решается задача на языке ассемблера для CPU i8086, в которой требуется вычислить значение логической формулы F=(X7&X6&X1) V (X6&X4&X2X1&X0 ) V (X7&X6&X3&X1) логическими переменными которой являются значения массива из 8 байт, и размещающей результат в оперативной памяти.
Ассемблер – это низкоуровневый язык программирования, символьная форма записи машинного языка. Его использование упрощает написание машинных программ. Именно машинный язык определяет логику работы процессора. Программы, написанные на ассемблере, отражают основные особенности архитектуры процессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д.
В качестве учебной среды для разработки курсовой работы будет выбран компилятор Microsoft Macro Assembler 6.13. В результате решения курсовой работы будет создана программа с названием var11.exe, реализующая необходимые функциональные возможности. Данная программа будет реализована как 16-разрядное консольное приложение, поэтому для успешной работы программы необходимо будет использовать персональный компьютер с операционной системой MS-DOS любой версии для процессоров CPU i8086. Особых требований к ресурсам компьютера программа иметь не будет.
Значение данного проекта будет заключаться в том, что разработка курсовой работы позволит изучить методы программирования на языке ассемблера – языке низкого уровня, который является универсальным языком программирования, позволяющим изучить архитектуру персонального компьютера и его инструкции.
Пояснительная записка будет состоять из 4 основных разделов.
Первая глава пояснительной записки – «Постановка задачи» – будет содержать цель задачи, описание предметной области, способы ввода и вывода данных и др. Этот этап является одним из основных, так как содержательное описание служит базисом для дальнейшей работы.
Вторая глава пояснительной записки – «Анализ задачи». На данном этапе происходит моделирование курсового проекта. Формальная модель задачи должна быть лишена избыточности и неопределенности. Будет определена входная и выходная информация, типы используемых данных, таблицы символов, диапазоны представления чисел в зависимости от выбранных типов, предполагаемый размер сегмента данных, режимы адресации, которые предполагается использовать для доступа к элементам и др. На данном этапе будет построена блок-схема программы.
В
главе «Реализация задачи»
Одним из самых главных разделов пояснительной записки является раздел «Тестирование и отладка программы». Функциональное тестирование гарантирует работу всех элементов программы. В данном разделе описываются все возможные действия пользователя при работе с программой, а также необходимо предусмотреть корректность работы всех структурных блоков программы. Тестирование будет произведено для пяти тестовых примеров (т.е. 5 различных наборов входных данных).
Заключение курсового проекта состоит в подведении итогов, а также здесь отмечаются достоинства и недостатки использованных методов решения задачи, возможные варианты модификации программы.
Источники информации, используемые при разработке программы, будут указаны в разделе «Литература».
Необходимо разработать программу, в которой требуется Вычислить значение логической формулы F=(X7&X6&X1) V (X6&X4&X2X1&X0 ) V (X7&X6&X3&X1) логическими переменными которой являются значения массива из 8 байт.
Массивы представляют собой ограниченную упорядоченную совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Специальных средств описания массивов в программах ассемблера нет. При необходимости использовать массив в программе программист его моделирует самостоятельно.
Все элементы массива располагаются в памяти компьютера последовательно. Само по себе такое расположение ничего не говорит о назначении и порядке использования этих элементов. И только лишь программист с помощью составленного им алгоритма обработки определяет, как нужно трактовать эту последовательность байт, составляющих массив. Так, одну и ту же область памяти можно трактовать как одномерный массив, двухмерный массив или обычные числовые или символьные данные. Сами по себе данные не несут никакой информации о своем «смысловом» или логическом типе.
Эти
же соображения можно
Алгоритмы обработки массивов включают в себя, как правило, последовательную обработку каждого из элементов массива. Такая последовательная обработка называется сканированием массива, и для ее реализации удобнее всего использовать команду ассемблера loop.
При выполнении курсовой работы необходимо предусмотреть структурированность программы, то есть все стандартные действия с массивами должны быть оформлены лаконично и объединены в модуль.
Информация, используемая в программе, будет вводиться программным образом или будет представлена в виде констант. Программа завершит свою работу по нажатию любой клавиши после обработки массива.
Константами называются перечисление величин в программе. Например, для программы важно определить константу maxcount=8 (число свободно помещается в одном байте) для хранения размера массива данных, а также возможные сообщения программ в виде символьных массивов данных, например:
mes1 db "Massiv:",0 ;сообщения программы
mes2 db "(x7 & x6 & x1) OR (x6 & x4 & x2 & x1 & x0) OR (x7 & x6 & x3 & x1)",0
mes3 db "FALSE",0
mes4 db "TRUE",0
Для описания сообщений в программе под каждый символ будет выделен также один байт.
Значения массива данных также определены в коде программы:
Array db 1, 1, 1, 0, 1, 0, 1, 1
В конце работы программы в
зависимости от значения
С помощью директивы .model можно выбрать одну из стандартных моделей памяти для программ на языке ассемблера. Модель памяти рассматривают как конфигурацию, которая указывает, каким образом надо комбинировать используемые сегменты. Каждая модель имеет свои ограничения по максимальному размеру памяти, выделяемой для команд и данных.
Модели памяти в языке программирования ассемблер на платформе x86 – способ указать предположения, которые должен сделать компилятор при генерации кода для платформ с сегментной адресацией памяти или со страничной памятью. Существует пять моделей памяти: tiny, small, medium, compact, large. Для разрабатываемой программы будет выбрана модель памяти small (малая). Эта наиболее распространенная модель памяти при разработке отдельных небольших прикладных программ на языке ассемблера. Данная модель памяти позволит создать загрузочный модуль формата *.exe. Программы формата *.exe немного сложнее в исполнении, но для них отсутствует ограничение размера в 64 килобайта, так что все достаточно большие программы используют именно этот формат. Конечно, ассемблер позволяет уместить и в 64 килобайтах весьма сложные и большие алгоритмы, а все данные хранить в отдельных файлах, но ограничение размера все равно очень серьезно, и даже чисто ассемблерные программы могут с ним сталкиваться.
В данной модели памяти сегменты кода и данных расположены отдельно друг от друга и не перекрываются, что позволяет иметь 64Кб кода программы и 64Кб данных и стека. Данные и сегмент стека объединены в одну группу и поэтому соответствующие сегментные регистры (DS и SS) имеют одно и то же значение. Условие задачи позволяет не использовать возможности стека, поэтому под данные будут отведены 64Кб в полной мере.
Переходы в программе и вызовы подпрограмм, а также доступ ко всем переменным осуществляется с помощью короткой адресации near (ближний).
Адресация памяти вычислительных систем – метод указания на ячейку памяти, к которой производится доступ. Адресация может быть:
Все виды адресации могут быть переведены друг в друга, однако использование специфичной адресации может ускорить выполнение программы. Для разработки курсового проекта целесообразно использовать непосредственную адресацию. В качестве операнда-источника можно использовать константу записываемую непосредственно в команду. Например:
mov bx,-15 ;в регистр bx занесено отрицательное число 15
mov al,‘*’ ;в регистр al занесен ascii-код ‘*’
mov cx,10 ;установка счетчика повторения
В качестве таких данных могут использоваться байты или слова, причем считается, что эти величины имеют знак. Если при записи команды используется константа меньшей размерности, чем приемник, она будет автоматически увеличена за счет знакового бита до нужной величины. Однако нельзя загружать константу сразу в сегментные регистры.
Константу удобно применять для инициализации, т.е. задания начального значения регистров и ячеек памяти, для сравнения чисел с граничным значением и т.д. Непосредственные операнды выбираются быстро, т.к. могут поступать прямо из очереди команд, без обращения к памяти. Необходимо помнить, что непосредственные операнды используются только в качестве источников.
Регистровая адресация часто применима при написании программ на языке ассемблера (операнды выбираются из регистров процессора). Например:
inc ch ;увеличивает содержимое старшего байта регистра cx на 1
mov di,bx ;содержимое bx засылаем в di
Прямая адресация (абсолютная) используется в тех случаях, когда явно известен адрес операнда и память адресуется непосредственным указанием смещения. Адрес ячейки памяти (слова или байта) указывается в команде, обычно в символической форме. Например:
inc mem1 ;содержимое слова с именем mem1 увеличивается на 1
mov pr2,23h ;запись числа 23h в переменную с именем pr2
inc [376h] ;содержимое ячейки по адресу ds:376h увеличивается на 1
Задание курсового проекта предполагает работу с массивом однобайтовых знаковых чисел, поэтому необходимо будет использовать базово-индексную адресацию. Этот способ адресации распространен при работе с массивами. Используется два регистра. В одном база – начало массива, в другом индекс – смещение относительно начала массива. Например:
add ax,[bp][si+5] ;смещение в стеке
mov mas[bx][di],21h ;mas – постоянное смещение
mov dx,mas[si] ;программа работает в одном сегменте
Для реализации в программе условных и безусловных переходов, вызовов подпрограмм, циклов следует использовать относительную адресацию, чтобы адресовать ячейку памяти, содержащую следующую команду. Представим простой пример цикла:
k1: