Моделирование программы гипотетической машины с помощью макросредств

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

Определить длину слова в строке не составляет труда для этого необходимо знать адрес начала слова, завести счетчик количества букв, а затем, последовательно просматривая строку и инкрементируя счетчик, искать признак конца слова (знак препинания). В счетчике будет находиться длина слова. Наша команда будет выполнять этот алгоритм.

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

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

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

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

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

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

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

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

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

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

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

Задачи удаления лишних знаков препинания и определения длины каждого слова не являются сложными и их можно реализовать не разбивая их на подзадачи.

Рассмотрим задачу удаления лишних препинаний. Эта задача реализована макросом DeleteSign. Решить задачу можно определением знаков препинаний и затем "удаления" их путём затирания буквами, следующих за этими знаками. При этом надо не забывать уменьшать длину строки в первом байте строки. Также нужно в конец каждого слова записывать символ запятой, т.к. это записано в задании. Реализовать затирание знаков препинания можно пересылая байты с буквами на место байтов с препинаниями.

Такую пересылку можно осуществить применив команду MOVSB столько раз сколько это необходимо. Т.о. команда DeleteSign работает по следующему алгоритму:

  1. Найти начало первого слова.
  2. Затереть препинания следующие перед первым словом.
  3. Найти следующее слово.
  4. Затереть препинания следующие перед этим словом.
  5. Повторять п.4 пока не конец предложения.

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

Далее проходя последовательно по строке и находя конец слова вставлять его длину пока предложение не закончится.

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

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