Обработка строк данных на языке Ассемблера (Лабораторная работа № 1)

Страницы работы

5 страниц (Word-файл)

Содержание работы

Министерство Образования и Науки Российской Федерации

Федеральное Агентство по Образованию

Новосибирский Государственный Технический Университет

Кафедра Прикладной математики

NGTU

Лабораторная работа №1:

По дисциплине «Языки программирования»

«ОБРАБОТКА СТРОК ДАННЫХ НА ЯЗЫКЕ АССЕМБЛЕРА»

Факультет:        ПМИ

Группа:              ПМ-63

Студенты:          Ковырзин А.В.

                            Наумова Е.А.

Вариант:            4     

Преподаватель: Петров Р.В.

                            Полетаева И.А.

Новосибирск

2008

1)  Задание:

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

2)  Алгоритм решения:

Пусть       s-строка

                  p-искомая подстрока

a)   Ввод s и p с консоли. Так как для ввода используется функция  0Ah, то 2 первых байта строки будут заняты служебной информацией.

b)   Ищем вхождение первого символа p в строку s (используется cmps).

                Если вхождений этого символа не найдено – идём на выход (вхождений p в s не                

                обнаружено).

c)   Проверка совпадения p и подстроки в s.

               Если совпало – идём на вывод позиции (вхождение p в s обнаружено)

               Иначе, если строка не закончилась – идём на пункт b)

               Если строка закончилась – идём на выход (вхождений p в s не обнаружено)

Вывод десятичного числа (позиции):

      a) Делим число на 10

      b) Записываем остаток во вспомогательную строку

      с) Если остаток не равен 0, то идём на пункт a)

Текст программы         

model small                     ;модель памяти

print macro st,off             ;макрос вывода строки

        pusha

      mov AH,09h               ;номер функции DOS

      lea DX, st+off            ;загружаем смещение строки и смещение начала вывода

      int 21h                        ;прерывание DOS

      popa

endm

.data                                             ;начало сегмента данных

      source             db 200 dup (?)            ;резервируем память под исходную строку

      len_s = $-source                     ;длина строки

      substring         db 200 dup (?)            ;резервируем память под подстроку

      len_sub = $-substring             ;длина подстроки

        ent                 db 'Enter string:','$'               

      ent1                 db 10,13,'Enter substring:','$'

        nmes                         db 10,13,'Substring not found',10,13,'$'       

      mesMatch       db 10,13,'Substring was found',10,13,'$'      

      mesMismatch             db 10,13,'Substring not found',10,13,'$'

      mesSym          db 10,13,'Position:',10,13,'$'

.stack 100h                                   ;сегмент стека

      assume ds:@data,es:@data   ;связывание сегментов данных     

.code

main proc

        .386                          ;режим сов-ми с 386(для раб со стеком)

      mov AX,@data          ;настройка сегментных

      mov DS,AX                ;регистров на

      mov ES,AX                ;сегмент данных

      print ent,0                   ;вывод приглашения

      ;ввод строки                         

      lea DX,source             ;загружаем адрес строки

      mov source,len_s       ;в первый байт строки загружаем максимальную длину строки

      mov AH,0Ah              ;загружаем номер функции DOS для ввода строки

        int 21h                                 

      print ent1,0

      lea DX,substring        ;загружаем адрес строки

      mov substring,len_sub           ;в первый байт строки загружаем максимальную длину строки

      mov AH,0Ah              ;загружаем номер функции DOS для ввода строки

        int 21h         

      cld                               ;сброс флага DF-просмотр строки в порядке увеличения адресов

      mov AL,[substring+2]           ;загружаем в AL первый символ подстроки

      xor CX,CX                 ;обнуляем СХ

      mov CL,[source+1]    ;записываем в СХ количество символов в строке

      lea DI,source              ;кладём в DI адрес строки

      add DI,2                      ;переходим на 2 служебных символа вперёд     

cycl:                                             ;метка-начало цикла(входим в него если нашли символ, но подстрока не совпадает)

Похожие материалы

Информация о работе