Автор: Пользователь скрыл имя, 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
mov array[di],di ;Пересылаем в массив данных индекс массива
add di,1 ;через 1 байт
loop k1
При этом способе адрес формируется как сумма содержимого регистра IP, соответствующего текущей команде, и смещения d8, d16, определяющего положение следующей команды относительно текущей. Смещение, в отличие от абсолютной адресации, является знаковым и представлено в дополнительном коде. Имеет диапазоны от –128 до +127 или от –32768 до +32767. В ассемблерных командах обычно указывается не значение смещения, а метка той команды, которой передается управление.
Для
написания алгоритма программы
на языке Microsoft Macro Assembler 6.13 предварительно
необходимо создать блок-схему программы
для лучшего понимания алгоритма. Учитывая
стандарты по созданию схем алгоритмов
и программ, будет создана блок-схема для
дальнейшей реализации курсового проекта
(приложение А).
Программы, написанные на языке ассемблера, сильно отличаются от программ, созданных на языке высокого уровня, тем не менее, технология их разработки одинакова. При этом необходимо последовательно выполнить следующие этапы:
Таким образом, получим схему создания программ на языке ассемблера:
Рисунок
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 является создание исполняемого модуля из объектного модуля. Имя исполняемого модуля (загрузочного модуля) программы по умолчанию совпадает с именем объектного файла.
В начале написания исходного модуля средствами обычного текстового редактора 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 – определить байт.
Для реализации программы введем переменные (правильное синтаксическое описание переменных будет указано в листинге программы в приложении Б):
При работе с массивами необходимо четко представлять себе, что все элементы массива располагаются в памяти компьютера последовательно.
После описания переменных составим алгоритм программы. Для начала в 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.
Трансляцию программы можно осуществить двумя способами: при помощи команд командной строки или реактора 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