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

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

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

или равно, то продолжаем

; иначеbl, P2 ;bh, P1 ;bh, bl ; меняем слова местамиah, P2 ; P2 на следующее слово

mov P1, ah ; P1=P2P2, al ;

mov Flag, 1 ; Флаг обмена установитьMCMP ; Продолжаем сравнивать:ah, P2 ;P2 на следующее слово

mov P1, ah ;P1=P2P2, al ;

jmp MCMP ;Продолжаем сравнивать: ;Выход ;Восстановление регистров

;********Проверка на конец предложения****************************macro ofset ;Сохранить старые значения регистровsi, MyString ;Загрузить адрес начала строкиbx, bx ;Очистка BX

mov bl, ofset ;Загрузить адрес элемента проверкиsi, bx ;byte ptr[si], $ ;Cравнить элемент с признаком конца ;Восстановление регистров

;********Сдвиг строки вправо*************************************macro ofset

pushreg

mov bx, ofset ;С какого элемента сдвигатьbxdi, MyString ;Адрес сдвигаемой строки

mov si, di ;di ;ch, ch ;cl, byte ptr[si] ;Загрузка длины строки

inc cx ;byte ptr[si], cl ;Увеличиваем длину строки, т.к.сдвинем ее

; вправоdi, cx ;Вычисляем новые значения DI и SIsi, cx ;cx, bx ;Вычисляем кол-во сдвигаемых символовds ;Cовмещение сегментых регистровes ;DS и ESmovsb ;Сдвиг строки ;

;******Приведение всех слов к одному "размеру"*********************

ToOneSize macrotos0, tos1, tos2, tos3, tosendsi, MyString ;Загрузка строкиdh, byte ptr[si] ;Длина строки

inc si ;di, si ;строка-приемникdl, R0 ;в R0- max длина слова:cx, cx ;Очистка CXcl ;поправка:cl ;считаем кол-во букв в текущ.слове;;Загружаем в AL текущий символdh ;отслеживаем конец предложенияtosend ;если конец предлож-я то выходcl, dl ;если длина слова не равна max длинеTOS2 ;то вставляем символы , cl, cl ;иначе пропускаемsi ;и продолжаем просмотр дальшеTOS1 ;:al, , ;если не конец словаTOS1 ;то длина текущ.слова есть MAX и тогда

;продолжаем просмотрbx, si ;Вычисляем смещение откуда будемbx, di ;сдвигать строкуch, dl ;Вычисляем количество сдвигов

sub ch, cl ;ch, cl ;

xor ch, ch ;si, cx ;И новое значение SI-указатель на строку: ShiftRight bx ;сдвигаем СХ раз со смещ. ВХTOS3 ;TOS0:

EndM

;******Поиск слова с максимальной длиной***************************

FindMaxLen macroStart, End, MaxOrNo, No

lea si, MyString ;Загрузка обрабатываемой строкиcl, [si] ;Кол-во символов

xor ch, ch ;bx, bx ;

inc si ;;: ;Ищем первое словоal, $ ;Если конец предложенияMaxOrNo ;илиal, , ;конец словаMaxOrNo ;то проверяем на MAX длинуbl ;иначе инкреминтируем число букв в словеStart ;продолжаем пока не конец предложенияEnd ;:bl, bh ;сравниваем на MAX длинуNo ;если текущ.длина больше чем MAXаяbh, bl ;то MAX=текущ.:bl, bl ;иначе очищаем счетчик буквStart ;и продолжаем:R0, bh ;Помещаем в R0 MAX значениеR0, 05h ;Прибавляем к Max значению 5(2 скобки и 3

; цифры)

EndM

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

DeleteSign macroStart, beg, end, m0, m1, m2si, Mystring ;Загрузка строкиcl, byte ptr[si] ;Кол-во букв в строке

inc cl ;инкр.т.к.добавим один символ

mov byte ptr[si], cl ;di, si ;строка-приемникch, ch ;

add di, cx ;На конец предложенияbyte ptr [di-1], , ;запись в конец предложения , byte ptr[di], $ ;и признака конца предложенияsi ;на начало строкиdi, si ;ds ;Совмещение регистровes ;

;Удаление знаков препинания если: ;нет первого слова; загрузка символа строкиal, ; Поиск знаков препинания

je m0 ;al, . ;m0 ;al, , ;m0 ;cx ;di ;

dec si ; поправкаmovsb ; "Удаление" символов

pop dicxdi

jmp Beg: loop Start

;Удаление препинаний после первого и: ;последующих словsi, didial, ;Поиск знаков препинания

je m1al, .m1al, ,m1BegEnd:

lodsbal, ;Поиск знаков препинания

je m2al, .m2al, ,m2cxdibyte ptr[di-1], , ;запись в конец слова ,

dec si ;поправкаmovsb ;"Удаление" препинаний

pop dicxbeg: loop m1: popreg

;******Сравнение слов********************************************macro FirstWord, SecondWordsi, Mystring ;Загрузка строкиdi, sidsesch, ch

mov cl, FirstWord ;Вычисление начала первогоsi, cx ;иch, ch ;второго

mov cl, SecondWord ;словdi, cx ;ch, chcl, R0 ;длина цепочкиcmpsb ;продвигаемся по цепочке

;*****Обменять слова********************************************macro First, SecondmLoopsi, MyString ;загрузка строкиdi, si ;

xor ch, ch ;cl, First ;вычисление первогоsi, cx ;иch, ch ;второго

mov cl, Second ;словdi, cx ;

xor ch, ch ;cl, R0 ;длина слов:al, byte ptr[si] ;загрузка обмениваемых символов

mov ah, byte ptr[di] ;al, ah ;обменbyte ptr[si], al ;

mov byte ptr[di], ah ;сохранение обменяных символовsi ;di ;mLoop ;продолжаем пока не конец слов

popreg

EndM

;*****Cчитывание строки с клавиатуры******************************

ReadString macro RdStrm1dx, RdStr ;адрес строки DS:DXbx, dxbyte ptr[bx], 250 ;MAX число вводимых символов

mov ah, 0ah ;Фукция DOS ввода строки21h ;вызов прерывания

;пропуск 1-го байта и запись в конец

; предложения символа $bx, RdStr ;в bx загружаем адресс строкиbyte ptr[bx+1] ;учитываем символ конца строки $cl, [bx+1] ;заносим в счетчик количество символовch, ch ; строки: mov al, [bx+1] ;сдвиг символов вправо на одну позицию[bx], albx ;переход к следующей паре символовm1al, $ ;заносим в конец строки символ $byte ptr[bx], al

;Перевод строки путем вывода на экран последовательно 2-х символов

;13 - перевод строки и 10 возврат кареткиah, 2h ;Функция DOS вывода символаdl, 13 ;в dl загружается код символа

int 21hdl, 1021h

EndM

;****Вывод строки на экран*****************************************

WriteString macro WrStrah, 09h ;Функция DOS вывода строки

lea dx, WrStr ;ссылка на сообщениеdx ;пропускаем длину строки21h ;вывести сообщение на экран

;Перевод строки путем вывода на экран последовательно 2-х символов

;13 - перевод строки и 10 возврат кареткиah, 2h ;Функция DOS вывода символаdl, 13 ;в dl загружается код символа

int 21hdl, 1021h

EndM

;******Вставка в конец слов значения их длин*************************

WriteLenWords macrom0, m1, m2, m3, m4, m5, mend

lea si, mystring ;Загружаем в SI адрес строки

inc sidi, sibx, bxbl, R0 ;R0-MAX длина

add di, bx ;di-cледующее слово

inc di: xor cx, cx ;

mov cl, R0 ;занесение в счетчик: cld ;;загрузка текущего элемента строкиal, $ ;если конец предл?/p>