Определение входной и выходной информации

Введение

Курсовой проект «Разработка программы на языке ассемблера для 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 байт.