Системные функции DOS ввода-вывода информации. Обработка строковых переменных

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

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

Министерство общего и профессионального образования РФ

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

Кафедра ВТ

Лабораторная работа № 2 по дисциплине «Программирование»

Системные функции DOS ввода-вывода информации. Обработка строковых переменных.

                                                Вариант: 7

Факультет: АВТ

Группа: АМ-415

Студенты: Кадобнов И.Л., Медведев А.В.

Преподаватель: Афанасьев В.А.

 Новосибирск 2006

1.Цель работы:

1.Освоение стандартных способов ввода-вывода DOS.

2.Разработка программ по обработке символьной информации с использованием строковых команд.

2.Задание к лабораторной работе:

Ввести строку из произвольного числа символов и произвести в ней поиск подстроки COMPUTER. Если такой подстроки нет, то данную подстроку ввести в начало исходной строки и вывести на экран. В противном случае дать сообщение There is. Программу защитить паролем.

3.Описание алгоритмов:

·  Ввод строки в буффер:

mov bx,0 ;обнуление bx

Entry:           mov ah, 01h ;номер функции ввода (с эхом)

                    int 21h ;вызов

                    cmp al, 13; проверка на нажатие ввода (выход из цикла)

                    je Find

                    mov [cBuf+bx],al ;помещение символа al в буфер cBuf со смещением bx

                    inc bx   ; увеличение смещения(счетчика)

                    jmp Entry; переход на начало

·  Поиск подстроки в строке

Find:           mov [wEnteredLnLen],bx ; в wEnteredLnLen – длину введенной строки

                                    mov bx,0

                    mov cx,[wEnteredLnLen]

                    mov si, offset cLine      ;смещение к искомой строке 

                    mov ah,0                      ;счетчик последовательных совпадений символов

Cycle:          lea di,[cBuf + bx]         ;di – смещение, с которого сканировать строку

                    mov al, [byte si]           ;искать символ al

                    mov dx, cx                   ;запомнить cx

                    repne scasb                  ;поиск символа al

                    jne Failed                     ;если не найден – выход (с ошибкой)

Found:          cmp ah,2                      ;если ah < 2, переход на First

                    jl First                         

                    sub [wTemp],1             ;если cx меняется на 1 (последовательное совпадение)

                    cmp cx,[wTemp]

                    je First                         ;переход на first

                    mov si, offset cLine-1  ;сброс указателей и счетчиков

                    mov cx,dx

                    mov ah,0

First:            inc ah                          

                    cmp ah, [byte wLnLen];если ah равно длине искомой строки – выход (успех)

                    je Succeeded                           

                    cmp cx,0                      ;если cx=0 (все еще не найдена строка) – выход(ошибка)

                    je Failed

                    mov [wTemp],cx          ;запомнить cx

                    mov bx, [wEnteredLnLen] ;вычисление смещения bx

                    sub bx,cx

                    inc si               

                    jmp Cycle                                                       

4.Полный исходный текст программы:

            %TITLE "strsearch.ASM"

                IDEAL

                MODEL small               

                STACK 256

                DATASEG

                            cPsw    DB 'oxi'

                            wPswLen DW $ - cPsw

                            cBuf      DB 80 DUP (?)

                            cPrompt DB 13,10,'Vvedite parol: $'

                            cOK       DB 13,10,'Parol vernii!$'

                            cErr       DB 13,10,'Parol ne vernii, poprobuite esche!$'

                            cEL        DB 13,10,'Vvedite stroku: $'

                            cLine     DB 'computer'

                            wLnLen  DW $-cLine

                            wTemp  DW ? ; Переменная для хранения временных символов, строк

                            wEnteredLnLen DW ? ; Переменная для хранения длинны строки

                            cFound  DB 13,10,'There is!$'

                            cBuf2    DB 88 DUP(?)

                            len         DW ?

                CODESEG

;вывод запроса ввода пароля

Start:                   mov ax,@data

                            mov ds,ax

                            ;Prompt output

                            mov ah,09h

                            mov dx,offset cPrompt

                            int 21h

                            ;entering password

                            mov bx,0

;ввод пароля в буфер cBuf (вывод звездочек на экран)

pass:                    mov ah, 08h

                            int 21h

                            cmp al, 13

                            je compare

                            mov [cBuf+bx],al

                            mov ah, 02

                            mov dl, '*'

                            int 21h

                            inc bx

                            jmp pass

;побайтовое сравнение эталона и введенного пароля

compare:             push ds

                            pop es

                            mov si, offset cBuf

                            mov di, offset cPsw

                            cld

                            mov cx, [wPswLen]

                            repe cmpsb         

                            je OK

;ошибка – пароль не верный

Error:                  

                            mov ah,09h

                            mov dx,offset cErr

                            int 21h

                            jmp Start

;доступ разрешен

OK:                      mov ah,09h

                            mov dx,offset cOK

                            int 21h

                            mov ah,09h

                            mov dx,offset cEL

                            int 21h

;ввод строки, в которой производится поиск подстроки

mov bx,0 ;обнуление bx

Entry:                  mov ah, 01h ;номер функции ввода (с эхом)

          int 21h ;вызов

          cmp al, 13; проверка на нажатие ввода (выход из цикла)

          je Find

          mov [cBuf+bx],al ;помещение символа al в буфер cBuf со смещением bx

          inc bx    ; увеличение смещения(счетчика)

          jmp Entry; переход на начало

;Посимвольное сравнение

Find:                    mov [wEnteredLnLen],bx ; в wEnteredLnLen – длину введенной строки

                            mov bx,0

          mov cx,[wEnteredLnLen]

          mov si, offset cLine          ;смещение к искомой строке      

          mov ah,0                            ;счетчик последовательных совпадений символов

;Цикл поиска символа

Cycle:                  lea di,[cBuf + bx]              ;di – смещение, с которого сканировать строку

          mov al, [byte si]  ;искать символ al

          mov dx, cx                         ;запомнить cx

          repne scasb                        ;поиск символа al

          jne Failed                          ;если не найден – выход (с ошибкой)

;Поиск

Found:                 cmp ah,2                            ;если ah < 2, переход на First

          jl First                               

          sub [wTemp],1                  ;если cx меняется на 1 (последовательное совпадение)

          cmp cx,[wTemp]

          je First                               ;переход на first

          mov si, offset cLine-1  ;сброс указателей и счетчиков

          mov cx,dx

          mov ah,0

;Сравнение количества символов искомой строки

First:                    inc ah                                

          cmp ah, [byte wLnLen];если ah равно длине искомой строки – выход (успех)

          je Succeeded                                   

          cmp cx,0                            ;если cx=0 (все еще не найдена строка) – выход(ошибка)

          je Failed

          mov [wTemp],cx ;запомнить cx

          mov bx, [wEnteredLnLen] ;вычисление смещения bx

          sub bx,cx

          inc si                

                        jmp Cycle

;в буффер cBuf2 копируем сначала искомую строку, потом строку, в которой производился поиск                  

Failed:                 mov si, offset cLine

                            mov di, [wEnteredLnLen]

                            mov cx, [wLnLen]

                            repne movsb

                            mov si, offset cBuf

                            mov cx, [wEnteredLnLen]

                            repne movsb

                            mov [cBuf2+di],'$'                         

                            mov ah,09h

                            mov dx,offset cBuf2

                            int 21h

                            jmp Exit

;вывод сообщения «строка найдена»

Succeeded:          mov ah,09h

                            mov dx,offset cFound

                            int 21h  

;выход                             

Exit:                    mov ah,4ch

                            mov al,0

                            int 21h 

                            END Start

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

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

Тип:
Отчеты по лабораторным работам
Размер файла:
46 Kb
Скачали:
0