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

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

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

Важным является определение конца строки, т.к. Р2 приходит к концу строки раньше то проверяем не стоит ли Р2 на конце строки. Для этого удобно ввести макрос проверки конца строки TestEnd offset. Он осуществляет сравнение текущего элемента с признаком конца строки "$". Если Р2 стоит на конце строки, то проверяем произвели ли за этот проход хотя бы один обмен, если да, то продолжаем "выталкивать очередной пузырёк" иначе сортировка закончена.

Рассмотрим еще несколько макросов необходимых для работы программы:

 

BeginProg - Инициализация программы. Здесь производится привязка сегментных регистров к соответствующим сегментам.

EndProg - Стандартное завершение DOS программы.

PushReg - Сохранение в стек нескольких указаных регистров.

PopReg - Восстановление из стека нескольких указаных регистров

ReadString string - Чтение с клавиатуры строки для обработки.

WriteString string - Вывод обработанной строки на экран.

 

Теперь, когда рассмотрены все команды и их работа рассмотрим разработку алгоритма работы заданной задачи. Для начала необходимо ввести строку с помощью команды ReadString MyString, где MyString - наша исходная строка. Далее по условию задачи необходимо удалить все знаки препинания, удалим их с помощью команды DeleteSign. Теперь необходимо отсортировать слова, но перед этим подготовим строку соответствующим образом: найдем длину максимального слова (команда FindMaxLen) и приведем все слова к одному размеру (команда ToOneSize). Теперь отсортируем слова (команда Sorting). Запишем длины всех слов (команда WriteLenWords). Кажется, что задача выполнена, однако после приведения всех слов к одному размеру в строке остались лишние знаки препинания, здесь мы можем опять использовать команду DeleteSign. Задача полностью решена. Теперь запишем алгоритм работы программы.

 

3. Алгоритм

 

  1. Инициализация программы
  2. Ввод строки для обработки
  3. Удаление "лишних" знаков препинания
  4. Поиск слова с максимальной длиной
  5. Приведение слов к "одному размеру"
  6. Сортировка
  7. Определение длины каждого слова и его запись в конец слова
  8. Удаление "лишних" знаков препинания
  9. Вывод на экран результата
  10. Завершение работы программы

 

4. Результаты

 

При запуске файла Course.exe в ответ на приглашение "Введите строку:" набираем:

 

apple,melon astrachansky,african banana,armenian peachs are fruits.

"Обработанная строка: "[007],apple[005],are[003],armenian[008],astrachansky[012],banana[006],fruits[006],melon[005],peachs[006],

 

 

По результатам видно, что программа работает правильно.

 

5. Листинг программы

 

;///////////////////////////////////////////////////////////////////////////////////////////

:// Листинг основной программы

;//Сортировка слов с определением их длины и удалением знаков препинания.

;///////////////////////////////////////////////////////////////////////////////////////////Macros.inc ;Включение файла макросов; настройка на реальную ЭВМ

; две предыдущие макрокоманды обеспечивают выполнение программы ГМ на реальной ЭВМSEGMENT ;Начало кодового сегмента

START ;НАЧАЛО ПРОГРАММЫMessageIn ;Вывод строки приглашенияMyString ;Ввод строки для обработки;Удаление "лишних" знаков препинания;Поиск слова с MAX длиной;Приведение всех слов к одному размеру;Сортировка слов;Определение длины каждого слова

;и запись этого значения в конец слова;Удаление "лишних" знаков препинания

;после приведения слов к одному размеруMessageOut ;Вывод строки сообщения об окончании обработки.MyString ;Вывод обработанной строки

FINISH ;КОНЕЦ ПРОГРАММЫENDS ;Конец кодового сегментаATA SEGMENT ;Начало сегмента данныхdb 15, Введите строку:, $ ;Сообщение-Приглашениеdb 20, Обработанная строка:, $ ;Сообщение-Строка обработанаdb 249 dup (0), $ ;Строка для обработкиdb 0h ; Регистрыdb 0h ; общегоdb 0h ; назначенияdb 0h ;Флаг сортировкиdb 0h ;Первый указатель на словоdb 0h ;Второй указатель на словоENDS ;Конец сегмента данных

;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

;\\ Листинг макро библиотеки для файла Course.asm ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

InitRealComputer MACRO

.286

fw = 24 ; разрядность слова ГМ; fw = 8..255= 8 ; разрядность байта

EndLine EQU 10,13,$ ; код перевода строки при выводе

EndSTR EQU ,$ ; признак конца строки

ENDM

;--------------------------------------------------------------MACRO

;--------------------------------------------------------------MACRO n ; описание стекаSEGMENT STACKn*kByte dup (?)ENDS

;--------------------------------------------------------------MACRO ; описание сегмента данныхSEGMENT

;-------------------------------------------------------------- MACRO ; описание конца сегмента данных

Data1 ENDS

;--------------------------------------------------------------MACRO ; описание сегмента кода

Code1 SEGMENT

;--------------------------------------------------------------MACRO ; описание завершения программы

COURSE endp

;--------------------------------------------------------------MACRO ; описание конца сегмента кода

Code1 ENDSCOURSE

;********Инициализация программы**********************************

START Macrocs:code,ds:data ;Привязка сегментных регистровax, data ;ds, ax ;В DS-адрес сегмета данных

;********Завершение программы************************************

FINISH Macroax, 4C00h ;Функция DOS21h ;Завершить программу

;********Сортировка слов методом пузырька**************************

Sorting macroMbegin, MCMP, MNext, MExit, m0

pushreg ;Сохранить старые значения регистровal, R0 ;AL=R0 (В R0 длина максимального слова)al ;учитываем знак , Flag, 1 ;установка флага обмена слов: ;Flag, 1 ;обменивали строки?m0 ;Да -продолжаемfar ptr MExit ;Нет-Выход: mov Flag, 0 ;P1, 1 ;Занесение в указатели адресов

;сравниваемыхP2, 1 ;слов.P2, al ;: TestEnd P2 ;Указатель Р2 на конеце предложения?MBegin ;Да -пузырек всплыл, продолжаем

;Нет-P1, P2 ; сравниваем словаMNext ; если меньше