Министерство общего и профессионального образования РФ
Новосибирский государственный технический университет
Кафедра ВТ
Лабораторная работа № 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.