
- •1.Оформление лабораторных работ.
- •2.Лабораторная работа 1. Вычисление арифметического выражения.
- •3.Лабораторная работа 2. Программа табулирования функций, использующая ввод чисел с клавиатуры.
- •4.Лабораторная работа 3. Обработка одномерных массивов.
- •5.Лабораторная работа 4. Обработка двумерных массивов.
- •6.Лабораторная работа 5. Обработка строковых данных.
- •7.Лабораторная работа 6. Многомодульные программы.
6.Лабораторная работа 5. Обработка строковых данных.
Целью работы является изучение строковых команд.
Для выполнения этой работы следует переписать с дискеты исходный листинг программы “LABN5.ASM”. В сегмент данных вписать свои переменные и их значения. В сегмент кодов в процедуру MAIN ввести операторы, выполняющие действия, соответствующие индивидуальному заданию.
Ниже приведен пример решения следующий задачи: задано некоторое предложение, состоящее из слов, которое разделяются хотя бы одним пробелом, либо запятой и хотя бы одним пробелом, либо тире и хотя бы одним пробелом, либо двоеточием и хотя бы одним пробелом. После последнего слова стоит точка, либо восклицательный знак, либо вопросительный знак. Напечатать все слова, начинающиеся с некоторого заданного символа, а также их номера в предложении.
Примечания. Заглавная и прописная буква считаются разными символами.
Длина предложения не более 100 символов.
Длина слова не более 20 символов.
Например:
В лесу родилась елочка, в лесу она росла.
Символ – р.
Результат:
родилась – номер слова 3
росла - номер слова 8
В программе будут использованы следующие процедуры: процедура поиска начала слова BEG_WORD, процедура поиска конца слова END_WORD, процедура заполнения некоторого поля пробелами CLEAR-POLE. Для ввода предложения с клавиатуры используется процедура READ_KEYS.
Для защиты лабораторной работы необходимо знать строковые команды и все процедуры, использованные в данной лабораторной работе.
Т
екст
программы:
DSEG SEGMENT
; индивидуальные данные - начало
k DW ?
j DW ?
A DB 'р'
N DW ?
POLE DB 20 dup(?),'$'
PRT3 DB 'номер слова -'
BUFFER1 DB 6 dup(?)
DB 10,13,'$'
; индивидуальные данные - конец
USER_STRING DB 100,101 dup(?)
TEXT1BW DB 'нет точки или ? или !',10,13,'$'
TEXT2BW DB 'неверный символ -'
SYMBW DB ?
DB ', его номер -'
buffer2 DB 6 dup(?)
DB 10,13,'$'
BWC DB ?
symb db ' ,:-.!?'
stroka DB 100 dup(?)
DB 10,13,'$'
prt1 DB 'введите предложение:',10,13,'$'
prt2 DB 10,13,'ввели предложение:',10,13,'$'
Prob db ' $'
NEW_LINE db 13,10,'$' ;перевод строки
Buffer db 6 dup (?),'$'
DSEG ENDS
Stacks segment
dw 140 dup (?)
Stacks ends
CODES SEGMENT
MAIN PROC FAR
Assume CS:codes, DS:dseg, SS:stacks,ES:dseg
Mov AX,Dseg
Mov DS,AX
mov ES,AX
CLD
LEA DX,prt1
Call PRT ;печать 'введите предложение: '
lea DI,STROKA ; очистили STROKA
mov CX,100
call CLEAR_STR
CALL READ_KEYS ; ввели предложение в USER_STRING
lea DI,STROKA
mov SI,DX
REP movsb ; переписали предложение в STROKA
lea DX,PRT2
call prt
lea DX,stroka
call prt
; индивидуальная часть программы - начало
; пусть i - BX
mov N,1
lea BX,STROKA
BL5:
mov k,BX
call END_WORD
mov j,BX
mov SI,k
mov AH,A
cmp byte ptr[SI],AH
je BL8
jmp BL12
BL8:
lea DI,POLE ; очистка POLE
mov CX,20
call CLEAR_STR
; перепись слова в POLE
mov CX,BX ; подсчет длины слова
sub CX,SI
inc CX
lea DI,POLE
REP movsb
; печать слова
lea DX,POLE
call PRT
push BX
mov AX,N
lea BX,BUFFER1
call convba
pop BX
lea DX,PRT3
call PRT
call NL
BL12:
inc N
call BEG_WORD
cmp BWC,0
je BL5
FIN:
; индивидуальная часть программы – конец
mov ah,1
int 21h
Mov AH,4CH
Int 21h
MAIN ENDP
;*********************************************************
CLEAR_STR proc ;процедура очистки поля
;адрес начала очищаемого поля в DI, количество символов в CX
push AX
push DI
push CX
mov AL,' '
REP STOSB
pop CX
pop DI
pop AX
RET
CLEAR_STR ENDP
;*********************************************************
CONVBA PROC ; процедура преобразования числа в строку ASCII-кода.
…
CONVBA endp
;*********************************************************
PRT PROC ; процедура печати текста
…
PRT ENDP
;*********************************************************
PRN PROC ;процедура печати числа
…
RET
PRN ENDP
;********************************************************
NL proc ; процедура перевода строки
…
NL endp
;*******************************************************
READ_KEYS proc ; процедура ввода строки в поле USER_STRING.
…
READ_KEYS endp
;*********************************************************
END_WORD proc
push SI
push AX
xor CX,CX
BEGEW:
push CX
mov CX,7
Lea SI,SYMB
COMP:
MOV AH,[SI]
CMP AH,[BX]
JE FINEW
INC SI
LOOP COMP
pop CX
inc BX
inc CX
JMP BEGEW
FINEW:
pop CX
dec BX
pop AX
pop SI
RET
END_WORD ENDP
;*******************************************************
BEG_WORD proc
push DX
push AX
lea DX,STROKA
add DX,100
mov BWC,0
inc BX ; переход на следующий символ после последнего в слове
mov AL,[BX]
cmp AL,'?' ; сравнение символа с '?' либо '!' либо '.'
je KONBW ; конец предложения
cmp AL,'!'
je KONBW
cmp AL,'.'
je KONBW
cmp AL,' ' ; сравнение с пробелом
je PROBBW
cmp AL,',' ; сравнение с ,
je GOPROBBW ; если запятая, то проверить наличие далее пробелов
cmp AL,'-' ; сравнение с -
; остается только символ :
GOPROBBW:
inc BX ; следующим должен быть пробел
cmp byte ptr[BX],' '
jne INVSYMBBW ; если не пробел - то это неверный символ
PROBBW: ; пропуск пробелов до начала следующего слова
inc BX
cmp BX,DX
jl M1BW
jmp ERRZICLBW ; в конце предложения нет '.' либо '?' либо '!'
M1BW:
cmp byte ptr[BX],' '
je PROBBW
jmp ENDPRBW
ERRZICLBW:
LEA DX,TEXT1BW
CALL PRT
mov BWC,1
jmp ENDPRBW
INVSYMBBW:
lea DX,TEXT2BW
mov AH,[BX]
mov SYMBW,AH
lea AX,STROKA
SUB AX,BX
neg AX
inc AX
lea BX,buffer2
call CONVBA
CALL PRT
KONBW:
mov BWC,1
ENDPRBW:
pop AX
pop DX
ret
BEG_WORD endp
;*********************************************
CODES ENDS
END MAIN
Варианты заданий:
Во всех заданиях - задано некоторое предложение, состоящее из слов, которое разделяются хотя бы одним пробелом, либо запятой и хотя бы одним пробелом, либо тире и хотя бы одним пробелом, либо двоеточием и хотя бы одним пробелом. После последнего слова стоит точка, либо восклицательный знак, либо вопросительный знак.
Примечания. Заглавная и прописная буква считаются разными символами.
Длина предложения не более 100 символов.
Длина слова не более 20 символов.
Напечатать первый символ из каждого слова и длину каждого слова.
Напечатать те слова, в которых некоторый символ А встречается больше 2 раз. Напечатать номера этих слов.
Напечатать те слова, в которых одинаковые первый и последний символы. Напечатать длины этих слов.
Напечатать все слова, состоящие не более чем из 3 символов. Напечатать их номера.
Задано некоторое сочетание из двух символов. Напечатать все слова, в которых встречается это сочетание. Напечатать длины этих слов.
Напечатать все слова, в которых гласных символов более трех. Напечатать номера этих слов.
Напечатать все слова, в которых гласных более чем согласных. Напечатать длины этих слов.
Напечатать все слова, которые начинаются с гласных. Напечатать номера этих слов.
Напечатать каждое второе слово и его длину.
Заданы два целых положительных числа А и В (А<В). Напечатать слова с номерами А+1, А+2, …, В.
Напечатать все слова, второй символ в которых гласный. Напечатать номера этих слов.
Задано некоторое положительное целое число А. Напечатать слова с номерами А-1 и А+1. Напечатать длины этих слов.
Напечатать слова, длина которых > 3 и < 10. Напечатать номера этих слов.
Убрать из предложения все слова, начинающиеся с некоторого символа А. Подсчитать количество слов в первоначальном предложении и в новом предложении.
Убрать из предложения все слова, длина которых > 3. Подсчитать количество слов в первоначальном предложении и в новом предложении.
Найти в предложении слово максимальной длины. Напечатать его длину и номер. Если таких слов несколько, то напечатать только первое слово.
Найти в предложении слово минимальной длины. Напечатать его длину и номер. Если таких слов несколько, то напечатать только первое слово.
Задано некоторое слово. Найти в предложении это слово. Напечатать его номер. Если это слово встречается более одного раза, то найти все вхождения. Если такого слова нет, то сообщить об этом.
Заданы два слова одинаковой длины. Найти первое слово в предложении и заменить его вторым словом. Напечатать номера этого слова в предложении.
Заданы два некоторых символа А и В. Напечатать все слова, начинающиеся с символа А и заканчивающиеся символом В. Напечатать их номера.
Все слова в предложении имеют одинаковую длину. Заданы два целых положительных числа А и В. Это номера слов в предложении. Поменять местами эти два слова. Если, хотя бы одного слова с номером А или В нет, то сообщить об этом.
Заданы два некоторых символа А и В. Напечатать все слова, которые начинаются с символа А и в которых символ В встречается более двух раз. Напечатать номера этих слов.
Заданы два некоторых символа А и В. Найти первое слово, начинающееся с символа А, напечатать его номер, а потом найти все слова, начинающиеся с символа В, напечатать их номера.
Заданы два некоторых символа А и В. Найти первое и последнее слово, начинающиеся с символа А. Напечатать их номера. Подсчитать сколько раз в этих словах встретился символ В.
Заданы два некоторых символа А и В. Найти первое и последнее слово, начинающиеся с символа А. Напечатать их длины. Найти все слова, располагающиеся между этими словами и начинающиеся с символа В.
Задано некоторое целое положительное число А. Напечатать все слова, номера которых кратны А, напечатать номера этих слов и их длины.
В предложении может подряд встретиться несколько одинаковых слов. Найти и напечатать эти слова и напечатать их номера и количество.
Найти в предложении все слова одинаковой длины, следующие подряд. Напечатать эти слова, их номера и количество.
Задан некоторый символ А. Найти слова, начинающиеся с этого символа, и переписать их в предложении в обратном порядке (наоборот). Напечатать слова, их длины и номера.
Подсчитать количество гласных символов в каждом слове. Напечатать слова, их номера и это количество.