Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oaip_2 / Курсовая ОАиП.doc
Скачиваний:
100
Добавлен:
27.05.2013
Размер:
204.8 Кб
Скачать

4.Постановка задачи

Решая задачу с помощью макросов сами макросы поместим в отдельный файл. Каждый макрос назовем так , чтобы его название было понятным , читаемым и выражало бы его функцию. Т.к. некоторые макросы используем неоднократно , а также названия некоторых меток в различных макросах повторяются , то все метки в каждом макросе обявим локальными с помощью LOCAL.

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

Поставленую задачу можно разбить на подзадачи и таким образом решить задачу будет более проще. Далее можно разбить подзадачи на еще более мелкие подзадачи, до тех пор пока их можно будет относительно легко решить.

Разобьем задачу на 3-и общие подзадачи:

  1. Ввод строки

  2. Обработка строки

  3. Вывод строки

Первую и третью подзадачи решить относительно просто. А вторую задачу надо будет разбить на еще более простые подзадачи. Эти задачи должны будут выполнять сортуровку слов, удаление лишних знаков препинания, определение и запись количества символов в словах. Т.о. разбили 2-ую подзадачу еще на три подзадачи.

Конечно же потребуется разбить и эти подзадачи на более мелкие, но это рассмотрим уже при разработке алгоритма.

Важным является представление строки в данной гипотетической маштне. Мы будем представлять ее в следующем виде:

Первый байт – длина строки в байтах.

Второй и последующие байты – сама строка.

Последниий байт – символ “$” как призна конца предложения.

Строка состоит максимум из 250 символов.

Не менее важным является организация трех регистров общего назначения.

Их можно определить в сегменте данных как некие переменные размером 8 бит, т.е.

один байт. Следует отметить, что эти регистры будут использоваться в командах гипотетической машины. Так очень интенсивно исполшьзуется регистр R0. Например в него будет заноситься максимальная длина слова, также он будет использоваться в других целях.

Также необходимо создать три обязательные команды, однако их будет не достаточно для решения поставленой задачи. Далее создадим еще несколько команд для решения поставленой задачи.

Задача поставлена и оговорены важные моменты. Теперь можно перейти к разработке алгоритма.

5.Разработка алгоритма

Для начала реализуем 3-и обязательные команды.

1.Сравнить 2-е символьны строки. Макрос CompareWords String1 , String2.

Реализовать её можно при помощи команды CMPS (Сравнение двух цепочек), которая по сути выполняет заданую команду. Остаётся только определить адреса сравниваемых элементов и их длину, что не представляет труда.

Адреса определим при помощи загрузки в регистр SI эффективного адреса строки и прибавлением к нему смещения относительно начала строки. Это будет адрес первого слова. Аналогично загрузим в DI адрес второго слова.

Т.к. мы сравниваем цепочку байт, то будем использовать команду CMPSB.

Далее остается проверить флаги стандартным образом и перейти на соответствущую

метку.

2.Обмен двух символьных строк. Макрос ChangeWords String1 , String2.

Обмен в данном макросе реализован с помощью команды XCHG , которая обменивает 2-а операнда (в нашем случае байта). Так как нам необходимо обменять символьные строки , то естественно надо произвести обмен N байтов , где N – длина строк. В данной гипотетической машине число N будет братся из регистра R0. После определения адресов String1 , String2 (определение адресов строк здесь и далее будем осуществлять аналогично описаному в предыдущей команде) , числа обмениваемых символов приступаем непосредственно к обмену путем зацикливания команды XCHG на R0 раз. Выбор R0 не означает , что нам придется каждый раз записывать туда значение длины , просто команда определения длины слова будет записывать в этот регистр значение длины. Поэтому удобно использовать команду обмена после команды определения длины слова , которая будет описана ниже.

3.Определение длины слова. Макрос WriteLenWords.

Определить длину слова в строке не составляет труда для этого необходимо знать

адрес начала слова , завести счетчик количества букв , а затем , последовательно

просматривая строку и инкриментируя счетчик, искать признак конца слова (знак

препинания). В счетчике будет находиться длина слова. Наша команда будет

выполнять этот алгоритм.

Мы реализовали обязательные команды , однако для выполнения предложеной задачи этого будет мало , поэтому реализуем еще несколько команд.

Как описали в постановке задачи всю задачу мы разбили на подзадачи. Рассмотрим каждую подзадачу в отдельности.

1. Ввод строки.

Ввод реализуем при помощи стандартной функции DOS ввода предложений. После ввода строки приведем ее к стандартному виду гипотетической машины. Для этого в конец предложения запишем символ “$”, а в начало – длину получившейся строки.

2. Вывод строки.

Также реализуем при помощи стандартной функции DOS.

3. Обработка строки.

Эта подзадача является самой главной и сложной. С ходу ее не решить, поэтому мы

разбиваем ее на подзадачи. Основными функциями обработки являются:

  • Сортировка слов

  • Удаление лишних знаков препинания

  • Запись в конец каждого слова значения его длины

Соседние файлы в папке oaip_2