Определение входной и выходной информации
Введение
Курсовой проект «Разработка программы на языке ассемблера для CPU i8086» имеет цель обучить практическому применению знаний по дисциплине «Микропроцессорные средства и системы» и формирование умения самостоятельной работы с научной и справочной литературой и умение делать на основе ее изучения выводы и обобщения, создание и развитие навыков научно-исследовательской работы и практической деятельности.
Основными задачами курсовой работы следует считать: развитие навыков научно-исследовательской работы в части описания и формального представления основ функционирования микропроцессорных систем; а также практическое освоение методологии программирования микропроцессорных систем; приобретение опыта выработки обоснованных решений; совершенствование приемов работы с научно-технической и нормативной литературой, а также получение специальных навыков по разработке сопроводительной документации.
В первом разделе, который называется «Постановка задачи», будет размещена формулировка задачи и подробное перечисление того, что требуется сделать.
Во втором разделе, под названием «Анализ задачи», будет определена входная и выходная информация, выбрана модель памяти. А так же будут выбраны режимы адресации для доступа к данным и разработана блок-схема.
В третьем разделе, который называется «Реализация», будет представлено описание этапов создания программы.
В четвертом разделе под названием «Тестирование» будет произведён тест полученной программы на пяти наборах входных значений.
В Заключении будет размещен вывод о проделанной работе и список литературы, использованной при подготовке.
Постановка задачи
Необходимо разработать программу на языке ассемблера для CPU i8086, выполняющую преобразование строки символов и выводящую полученный результат на экран.
Входная информация представляет собой строку, содержащую не менее пяти слов, которые разделены одним или несколькими пробелами. В результате всех преобразований нужно получить результирующую строку, в которой исходная последовательность слов будет представлена в обратном порядке, причём символы каждого слова тоже представляются в обратном порядке.
Требуется составить блок-схему алгоритма задачи, с помощью которой впоследствии будет реализовываться программа на языке ассемблера.
После реализации алгоритма задачи на языке ассемблера, необходимо провести оптимизацию полученного кода. Добиться оптимального использования памяти и обеспечения должного уровня быстродействия.
Окончательную версию программы необходимо протестировать. Тестирование будет проводиться как минимум на пяти входных переменных.
Так же в приложении Г представлена работа выполнения в АЛУ команды арифметического сложения операндов.
В приложение Е будут помещены страницы презентации.
2 Анализ задачи
Дана строка, содержащая не менее пяти слов разделённых одним или несколькими пробелами. Требуется переставить символы в каждом слове в обратном порядке и каждое слово переставить в обратном порядке.
Определение входной и выходной информации.
Входные значения программы представлены строкой символов размером в байт. Выходные значения будут помещены в массив, длина которого совпадает с входной строкой, размером в байт.
Рисунок 1 – Таблица ASCII
Все поля, зарезервированные поля данных должны быть определены в составе сегмента данных программы (data segment).
Для определения данных используются, главным образом, три директивы ассемблера: db (define byte, определить байт) для записи байтов, dw (define word, определить слово) для записи слов и dd (define double word, определить двойное слово) для записи двойных слов:
db 255
dw 6.553
dd 100000000
По условию задачи дана строка байт, поэтому необходимо использовать define byte (db).
В языке ассемблера имеются средства записи целых и вещественных чисел, а также символьных строк и отдельных символов. Целые числа могут быть со знаком и без знака, а также записанными в двоично-десятичном формате.
Рассмотрим целые числа без знака и со знаком. Числа без знака это самый простой вид чисел: они представляют собой весь диапазон двоичных чисел, которые можно записать в байте, слове или двойном слове. Для байта числа без знака могут принимать значения от 00h (0) до FFh (255); для слова - от 0000h (0) до FFFFh (65535); для двойного слова - от 00000000h (0) до FFFFFFFFh (4294967295). Пример кодирования беззнаковых чисел:
2910=1D16
В вычислительной технике принято записывать отрицательные числа в так называемом дополнительном коде, который образуется из прямого путем замены всех двоичных нулей единицами и наоборот (обратный код) и прибавления к полученному числу единицы. Это справедливо как для байтовых (8-битовых) чисел, так и для чисел размером в слово или в двойное слово. Пример кодирования знаковых чисел:
(-17)10 = EF16
Результат действия можно разместить в ячейке оперативной памяти или регистре процессора.
Пример размещения результата суммирования в регистре bl:
data segment
a db 2
b db 8
…
code segment
start:
…
mov bl, a
add bl, b ; результат сохраняется в регистре bl
Можно сохранять результат в ячейку памяти. Для этого необходимо ввести новую переменную и описать ее в сегменте данных:
data segment
a db 2
b db 8
cym db ?
…
code segment
start:
…
mov bl, a
add bl, b
mov cym, bl ;результат суммирования копируется в ячейку памяти cym
Для решения поставленной задачи используем второй вариант размещения результатов работы в ячейке оперативной памяти.
2.2 Выбор модели памяти
С помощью директивы .Model можно выбрать одну из стандартных моделей памяти.
Каждая модель имеет свои ограничения по максимальному размеру памяти, выделяемой для команд и данных. Для различных моделей требуется определенное число байт под размещение команд и данных. При использовании всех моделей памяти, кроме tiny, создаются программы типа .exe. Модель памяти .tiny используется для разработки .com файлов.
Все модели работают в режиме реального процессора и только лишь модель памяти flat рассчитана на работу программы в защищенном режиме.
Для реализации поставленной задачи выбираем модель памяти small. Сегмент кода данной модели отделен от сегмента данных и стека с которыми работает эта программа. Данные и сегмент стека объединены в одну группу и поэтому сегментные регистры SS и DS имеют одно и тоже значение.
Это наиболее распространенная модель памяти для разработки программ. Переходы в программе и вызовы подпрограмм, а так же доступ ко всем переменным осуществляется при помощи ближней адресации.
Сегемент стека используется для прерываний и для сохранения значений регистров. Так как в программе это используется не много то размер стека выбираем равным 64 байт или 40h байт.
…
.stack
dw 64 dup(0)
…
По файлу листинга можно сделать вывод о размере сегменте данных и сегменте кодов.
Сегмент данных будет примерно занимать 640 байт.
Сегмент кодов будет примерно занимать 1056 байт.