Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_ук_Ассемблер.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
311.81 Кб
Скачать

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 символов.

  1. Напечатать первый символ из каждого слова и длину каждого слова.

  1. Напечатать те слова, в которых некоторый символ А встречается больше 2 раз. Напечатать номера этих слов.

  2. Напечатать те слова, в которых одинаковые первый и последний символы. Напечатать длины этих слов.

  3. Напечатать все слова, состоящие не более чем из 3 символов. Напечатать их номера.

  4. Задано некоторое сочетание из двух символов. Напечатать все слова, в которых встречается это сочетание. Напечатать длины этих слов.

  5. Напечатать все слова, в которых гласных символов более трех. Напечатать номера этих слов.

  6. Напечатать все слова, в которых гласных более чем согласных. Напечатать длины этих слов.

  7. Напечатать все слова, которые начинаются с гласных. Напечатать номера этих слов.

  8. Напечатать каждое второе слово и его длину.

  9. Заданы два целых положительных числа А и В (А<В). Напечатать слова с номерами А+1, А+2, …, В.

  10. Напечатать все слова, второй символ в которых гласный. Напечатать номера этих слов.

  11. Задано некоторое положительное целое число А. Напечатать слова с номерами А-1 и А+1. Напечатать длины этих слов.

  12. Напечатать слова, длина которых > 3 и < 10. Напечатать номера этих слов.

  13. Убрать из предложения все слова, начинающиеся с некоторого символа А. Подсчитать количество слов в первоначальном предложении и в новом предложении.

  14. Убрать из предложения все слова, длина которых > 3. Подсчитать количество слов в первоначальном предложении и в новом предложении.

  15. Найти в предложении слово максимальной длины. Напечатать его длину и номер. Если таких слов несколько, то напечатать только первое слово.

  16. Найти в предложении слово минимальной длины. Напечатать его длину и номер. Если таких слов несколько, то напечатать только первое слово.

  17. Задано некоторое слово. Найти в предложении это слово. Напечатать его номер. Если это слово встречается более одного раза, то найти все вхождения. Если такого слова нет, то сообщить об этом.

  18. Заданы два слова одинаковой длины. Найти первое слово в предложении и заменить его вторым словом. Напечатать номера этого слова в предложении.

  19. Заданы два некоторых символа А и В. Напечатать все слова, начинающиеся с символа А и заканчивающиеся символом В. Напечатать их номера.

  20. Все слова в предложении имеют одинаковую длину. Заданы два целых положительных числа А и В. Это номера слов в предложении. Поменять местами эти два слова. Если, хотя бы одного слова с номером А или В нет, то сообщить об этом.

  21. Заданы два некоторых символа А и В. Напечатать все слова, которые начинаются с символа А и в которых символ В встречается более двух раз. Напечатать номера этих слов.

  22. Заданы два некоторых символа А и В. Найти первое слово, начинающееся с символа А, напечатать его номер, а потом найти все слова, начинающиеся с символа В, напечатать их номера.

  23. Заданы два некоторых символа А и В. Найти первое и последнее слово, начинающиеся с символа А. Напечатать их номера. Подсчитать сколько раз в этих словах встретился символ В.

  24. Заданы два некоторых символа А и В. Найти первое и последнее слово, начинающиеся с символа А. Напечатать их длины. Найти все слова, располагающиеся между этими словами и начинающиеся с символа В.

  25. Задано некоторое целое положительное число А. Напечатать все слова, номера которых кратны А, напечатать номера этих слов и их длины.

  26. В предложении может подряд встретиться несколько одинаковых слов. Найти и напечатать эти слова и напечатать их номера и количество.

  27. Найти в предложении все слова одинаковой длины, следующие подряд. Напечатать эти слова, их номера и количество.

  28. Задан некоторый символ А. Найти слова, начинающиеся с этого символа, и переписать их в предложении в обратном порядке (наоборот). Напечатать слова, их длины и номера.

  29. Подсчитать количество гласных символов в каждом слове. Напечатать слова, их номера и это количество.