Моделирование программы гипотетической машины с помощью макросредств
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
?потетической машины. Так очень интенсивно используется регистр 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 работает по следующему алгоритму:
- Найти начало первого слова.
- Затереть препинания следующие перед первым словом.
- Найти следующее слово.
- Затереть препинания следующие перед этим словом.
- Повторять п.4 пока не конец предложения.
Команду вставки в конец слова значения его длины также достаточно просто реализовать. Небольшую сложность представляет собой преобразование численного значения длины слова в символьный эквивалент. В случае если мы сможем это сделать, то вставку этого символьного эквивалента можно будет осуществить путем непосредственной записи соответствующих символов в строку, необходимо будет только зарезервировать в конце каждого слова определенное количество байт, в противном случае значение длины слова может затереть следующее слово.
Далее проходя последовательно по строке и находя конец слова вставлять его длину пока предложение не закончится.
Рассмотрим как реализуется алгоритм преобразования численного значения длины слова в символьный эквивалент.
Одним из возможных вариантов преобразования является табличное преобразование, т.е. по значению регистра R0 мы выбираем из заранее созданной таблицы необходимый символьный эквивалент, например с помощью команды XLAT. Однако такой вариант требует создания таблицы. Но есть у этого варианта и свои преимущества - так