Разработка программы на языке ассемблера для CPU i8086, Вычисляющей значение логической формулы F=(X7&X6&X1) V (X6&X4&X2X1&X0 ) V (X7&X6&X3&X1) логическими перем

Автор: Пользователь скрыл имя, 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

Работа содержит 1 файл

Содержание.doc

— 332.00 Кб (Скачать)

    mov array[di],di ;Пересылаем в массив данных индекс массива

    add di,1    ;через 1 байт

    loop k1

    При этом способе адрес формируется  как сумма содержимого регистра IP, соответствующего текущей команде, и смещения d8, d16, определяющего положение следующей команды относительно текущей. Смещение, в отличие от абсолютной адресации, является знаковым и представлено в дополнительном коде. Имеет диапазоны от –128 до +127 или от –32768 до +32767. В ассемблерных командах обычно указывается не значение смещения, а метка той команды, которой передается управление.

    2.4 Разработка блок-схемы программы

    Для написания алгоритма программы  на языке Microsoft Macro Assembler 6.13 предварительно необходимо создать блок-схему программы для лучшего понимания алгоритма. Учитывая стандарты по созданию схем алгоритмов и программ, будет создана блок-схема для дальнейшей реализации курсового проекта (приложение А). 

 

3 Реализация

    3.1 Описание этапов создания программы

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

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

    Таким образом, получим схему создания программ на языке ассемблера:

    Рисунок 1 – Этапы разработки программ на ассемблере 

    Программа, написанная в командах ассемблера, называется исходной программой, которая хранится в файле *.asm (исходный модуль). Обычно объектным модулем называется файл, содержащий результат трансляции программы ассемблером. Таким образом, функцией ассемблера является преобразование исходной программы, доступной восприятию человеком, в объектную программу, понятную процессору. Результатом выполнения этого этапа является программа в машинных кодах с расширением *.obj. Естественно перевод состоится лишь в том случае, если исходный текст программы не содержит ошибок. Одновременно с объектным файлом могут быть созданы файлы листинга (*.lst) и перекрестных ссылок (*.crf). Рекомендуется файл листинга создавать обязательно, поскольку при наличии ошибок в листинге описывается характер ошибки сразу после ошибочной команды.

Таблица 1 – Форматы файлов, используемые ассемблером

Расширение Назначение
.asm входной файл ассемблера <source_name>.asm
.obj выходной файл перемещаемого объектного кода <source_name>.obj
.lst выходной файл листинга, генерируемый ассемблером: <source_name>.lst
.err выходной файл ошибок: <source_name>.err
.map выходной файл распределения памяти: <source_name>.map
.hex выходной файл объектного кода в шестнадцатеричном представлении: <source_name>.hex
.hxl/.hxh выходной файл объектного кода в шестнадцатеричном  представлении c раздельным представлением младших и старших байт: <source_name>.hxl, <source_name>.hxh
.lib библиотечный  файл и привязанный компоновщиком: <source_name>.lib
.lnk выходной файл компоновщика: <source_name>.lnk
.cod выходной символьный файл или файл отладчика: <source_name>.cod

    Файл, содержащий перемещаемую версию оттранслированной программы, называется исполняемым (загрузочным) модулем. Таким образом, функцией компоновщика link является создание исполняемого модуля из объектного модуля. Имя исполняемого модуля (загрузочного модуля) программы по умолчанию совпадает с именем объектного файла.

 

     3.1.1 Описание исходного модуля

    В начале написания исходного модуля средствами обычного текстового редактора Microsoft был создан файл var11.asm, в который была помещена общая структура программы на языке ассемблера:

    model small  ;модель программы, или же количество памяти на сегмент

    .data   ;сегмент данных

             ;описание  переменных

    .stack 100h  ;сегмент стека

    .code   ;сегмент данных

             ;процедуры,  макрокоманды

    start:

    mov ax,@data

    mov ds,ax

             ;основная  программа

    mov ax,4c00h

    int 21h   ;выход из программы

    end start

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

    Начало  программы начинается с распределения  памяти под код программы, данные и стек. Строка .model позволяет выделить по 64Кб под данные и код. Секция .data с инициализированными данными включается в исполняемый файл.

    Псевдокоманды определения данных записываются в  общем виде следующим образом: <имя_переменной> d* значение, где d* – одна из псевдокоманд. Для определения начальных данных будет использована одна псевдокоманда: db – определить байт.

    Для реализации программы введем переменные (правильное синтаксическое описание переменных будет указано в листинге программы в приложении Б):

  • maxcount – размер массива данных;
  • array – массив чисел размером в байт;
  • mes1,mes2,mes3,mes4 – сообщения программы (символьные массивы данных размером в байт).

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

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

    lea bp, Array  ;в bp заносим указатель на массив Array

          call DrawArray ;вывод массива (парам. функции: bp Указ. на массив)

    Теперь  произведем вычисление функции с заданным массивом. Для доступа к отдельному элементу массива используем к-ду byte ptr. В AL будем хранить результат. Для вычисления результата используем команды mov, and, or.

          xor al, al   ;в Al храним результат функции

          mov al, byte ptr Array[7] ;(x7 & x6 & x1)

          and al, byte ptr Array[6]

          and al, byte ptr Array[1]

          mov ah, byte ptr Array[6] ;(x6 & x4 & x2 & x1 & x0)

          and ah, byte ptr Array[4]

          and ah, byte ptr Array[2]

          and ah, byte ptr Array[1]

          and ah, byte ptr Array[0]

            or al, ah

          mov ah, byte ptr Array[7] ;(x7 & x6 & x3 & x1)

          and ah, byte ptr Array[6]

          and ah, byte ptr Array[3]

          and ah, byte ptr Array[1]

            or al, ah

     На  завершающей стадии программы осуществлялся вывод результата вычисления. Для этого были использованы команды сравнения (cmp), команды условного и безусловного переходов (je и jmp).

          cmp al, 0

          je L_RAVNO 

            jmp L_NERAVNO

          

    L_RAVNO:

          mov dx, offset mes3  ;заносим в dx адрес строки mes3

          call writestring  ;вывод строки mes3 

          jmp Exit 

    L_NERAVNO:

          mov dx, offset mes4  ;заносим в dx адрес строки mes4

          call writestring  ;вывод строки mes4

    Вывод результата на экран осуществляется функцией writestring, которая содержится в подключаемой библиотеке irvine.lib. Подключение данного модуля осуществляется командой в файле конфигурации реактора Assembler Editor 1.20.

    Завершение  программы осуществляется стандартным  способом по стандартному DOS-прерыванию int 21 функцией 4Сh.

    3.1.2 Трансляция программы

    Трансляцию  программы можно осуществить  двумя способами: при помощи команд командной строки или реактора Assembler Editor 1.20.

    Для транслирования файла var11.asm в командной строке необходимо набрать команду: masm var11.asm и нажать клавишу «Enter». Поскольку не задано другое имя для объектного файла, то будет создан объектный файл с этим же именем var11.obj. Заметим, что расширение имени файла *.asm вводить не требуется, т.к. Microsoft Macro Assembler 6.13 принимает его по умолчанию. Результат получения объектного файла представлен ниже:

    

    Рисунок 2 – Результат трансляции (получение объектного файла var11.obj)

    Из  сообщений Microsoft Macro Assembler 6.13 следует, что транслирование завершено без ошибок и отсутствия предупреждений. Предупреждение не является ошибкой, однако его игнорирование может привести к неприятностям в дальнейших этапах работы с программой, поэтому лучше своевременно реагировать на данный тип замечаний.

    Для компоновки программы нужно ввести в командную строку: link.exe var11.obj. Также необходимо подключить библиотеку импортируемых процедур irvine.lib, функции которой были подключены и использованы в файле var11.asm. Здесь, также как и при транслировании, расширение имени *.obj не является обязательным. По завершению компоновки будет сформирован файл var11.exe:

    Рисунок 3 – Результат компоновки программы var11.exe

 

    Теперь  программу var11.exe можно запустить на исполнение.

    При использовании реактора Assembler Editor 1.20 процесс компоновки намного упрощен и требует лишь открыть в редакторе файл var11.asm и последовательно выполнить три команды Assemble, Link и Run из меню Run реактора Assembler Editor 1.20.

    Рисунок 4 – Окно редактора Assembler Editor 1.20

Информация о работе Разработка программы на языке ассемблера для CPU i8086, Вычисляющей значение логической формулы F=(X7&X6&X1) V (X6&X4&X2X1&X0 ) V (X7&X6&X3&X1) логическими перем