Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

M_Asm2009LS

.pdf
Скачиваний:
17
Добавлен:
23.02.2016
Размер:
2.34 Mб
Скачать

m0:

cmp AH,0

; Перевірка виділення слова

 

je m31

; Перехід, якщо було виділено слово.

 

mov AH,0

; Встановлення ознаки слова для наступної

 

 

; послідовності.

 

jmp m1

; Пошук наступного послідовності знаків.

m31: cmp BP,BX

; Порівняння поточного виділеного слова з

 

jge m1

; найдовшим. Якщо поточне слова довше, тоді

 

mov BP,BX

; його довжина зберігається в регістрі BP,

 

mov DI,SI

; а відносна адреса слова в регістрі DI.

 

sub DI,BX

 

m1:

sub BX,BX

; Пошук початку послідовності символів.

 

cmp [SI],DH

 

 

jne m3

 

 

inc SI

 

 

loop m1

 

 

cmp BP,0

; Перевірка наявності слів.

 

jne m4

; Слова були.

 

jmp mns

; Слів не було. Вихід з програми.

m3:

mov AL,[SI]

; Виділення та перевірка

 

 

; послідовність символів.

 

cmp AL,DH

; Перевірка кінця послідовність символів.

 

je m0

; Перехід, якщо побіл (кінець послідовності).

 

cmp AL,'A'

; Перевірка, чи послідовність

 

jb m32

; складається з букв

 

cmp AL,'Z'

; від A до Z або a до z.

 

jb m33

 

 

cmp AL,'a’

 

 

jb m32

 

 

cmp AL,'z'

 

 

jb m33

 

m32:

mov AH,1

; Послідовність має символ, що не входить

 

 

; до заданого діапазону, тобто це не є слово.

m33:

inc SI

 

 

inc BX

; В регістрі BX довжина послідовності.

 

loop m3

 

 

cmp AH,1

; Перевірка останньої послідовності

 

je m4

; Перехід, остання послідовність не є словом

 

cmp BP,BX

;Порівняння довжини останнього

 

 

; слова з найдовшим.

jge m4

51

 

mov BP,BX

 

 

mov DI,SI

 

 

sub DI,BX

 

m4:

mov CX,BP

; Записати довжину слова в регістр СХ

 

jcxz mns

; Слів у рядку не було.

 

 

;Перехід на вихід із прогрми.

 

mov DL,0dh

; Переведення курсора на новий рядок.

 

mov AH,2

 

 

int 21h

 

 

mov DL,0ah

 

 

int 21h

 

 

lea DX, rez_p1

 

 

mov AH,9

 

 

int 21h

 

m5:

mov DL,[DI]

; Друк найдовшого слова.

 

mov AH,2

 

 

int 21h

 

 

inc DI

 

 

loop m5

 

 

ret

 

mns:

mov AH,2

 

 

int 21h

 

 

mov DL,0ah

 

 

int 21h

 

 

lea DX, rez_p2 ; Слів не було. Вихід з програми.

 

mov AH,9

 

 

int 21h

 

 

ret

 

Main

Endp

 

Code

Ends

 

 

End Main

 

Задача 2. Задано символьний рядок, який складається з декількох послідовностей символів, які розділяються не менше ніж одним символом пробілу (' '). Розробити програму, що для заданого символьного рядка друкує всі слова, які закінчуються послідовністю символів – "tion". Слова складаються з букв латинського алфавіту.

Розв’язування.

Data

Segment para 'Data'

max

= 255

string

db ' Input string ? ','$'

52

 

CheckWords db 'tion'

 

p_fw

db ' The find words : ','$'

p_nw

db ' No words ','$'

inputs

label byte

 

maxs

db max

 

 

nums

db ?

 

 

strs

db max dup(' ')

 

Data

Ends

 

 

Code

Segment

para 'code'

 

Assume

cs:Code,ds:Data,es:Data

newline proc near

; Підпрограма переведення курсора

 

push AX

 

; на новий рядок у початкову позицію.

 

push DX

 

 

 

mov DL,0dh

 

 

mov AH,2

 

 

int 21h

 

 

 

mov DL,0ah

 

 

int 21h

 

 

 

pop DX

 

 

 

pop AX

 

 

 

ret

 

 

newline

endp

 

Main

Proc far

 

 

 

push DS

 

 

 

sub AX,AX

 

 

push AX

 

 

 

mov AX,Data

 

 

mov DS,AX

 

 

call newline

; Переведення курсора на новий рядок.

 

lea DX, string

; Завантаження відносної адреси повідомлення.

 

mov AH,09h

 

 

int 21h

 

; Виведення на екран повідомлення.

 

call newline

; Переведення курсора на новий рядок.

 

lea DX,inputs

;Завантажити відносну адресу

 

mov AH,0Ah

; для введення рядка.

 

int 21h

 

; Введення рядка.

 

lea SI,strs

; Завантаження відносної адреси введеного рядка.

 

call newline

 

 

mov DH,' '

; Символ ‘ ‘ (пробіл) – у регістр DH.

 

sub BX,BX

; Довжина поточного слова.

 

 

 

53

 

sub BP,BP

; Ознака наявності шуканих слів.

 

sub CH,CH

; Очистити регістр CH.

 

mov CL,nums

; Кількість введених символів у регістр CL.

 

cmp CX,0

; Перевірка введення символи.

 

jne m01

; Перехід, якщо були введені символи.

 

jmp nwd

; Введених символів немає. Вихід з програми.

m01:

mov BX,CX

 

 

mov [SI+BX],DH

 

inc CX

 

m1:

sub BX,BX

; Пошук початку послідовності.

 

cmp [SI],DH

; Перевірка кінця послідовність символів.

 

jne m3

; Перехід, якщо побіл (кінець послідовності).

 

inc SI

 

 

loop m1

 

 

jmp m2

 

m3:

xor AH,AH

; Ознака слова : AH= 0

m31:

mov AL,[SI]

;Виділення та перевірка послідовність

 

 

; символів.

 

cmp AL,DH

; Перевірка кінця послідовність символів.

 

je m0

 

 

cmp AL,'A'

; Перевірка, чи послідовність

 

jb m32

; складається з букв

 

cmp AL,'Z'

; від A до Z або a до z.

 

jb m33

 

 

cmp AL,'a'

 

 

jb m32

 

 

cmp AL,'z'

 

 

jb m33

 

m32:

mov AH,1

; Послідовність знаків не утворює слово.

m33:

inc SI

 

 

inc BX

; В регістрі BX довжина послідовності.

 

loop m31

 

m0:

cmp AH,1

; Перевірка, чи було слово.

 

je m02

 

 

cmp BX,3

; Слово з кількістю символів <=3 не може

 

jg m11

; мати закінчення – "tion".

m02:

jcxz m2

; Перехід, якщо рядок кінець рядка.

 

jmp m1

; Перехід на пошук наступної послідовності.

m11:

push CX

; Перевіряємо слово.

 

push SI

 

54

 

 

 

mov CX,4

; Кількість символів у закінченні –"tion".

 

lea DI,CheckWords+3 ; Завантаження регістр DI адреси

 

 

; останньої букви шуканої послідовності.

 

dec SI

; Повернення на останню букву слова.

mchk:

mov AL,[DI]

; Порівняння по буквах закінчення виділеного

 

cmp AL,[SI]

; слова із заданим шаблоном ("tion").

 

jne mzs

; Перехід, якщо пара букв відрізняються.

 

dec DI

; Перехід до наступної пари букв.

 

dec SI

 

 

loop mchk

; Вихід із циклу букви попарно збігаються.

 

cmp BP,0

 

 

jne mm3

; BP<>0.

 

push DX

; Знайдене потрібне слово (BP=0),

 

lea DX,p_fw

; тоді друкується рядок «The find words : ».

 

mov AH,09h

 

 

int 21h

 

 

pop DX

 

 

call newline

;

mm3:

inc BP

 

 

pop DI

 

 

push DI

 

 

sub DI,BX

 

 

mov CX,BX

;

m5:

mov DL,[DI]

; Друк слова.

 

mov AH,2

 

 

int 21h

 

 

inc DI

 

 

loop m5

 

 

call newline

 

mzs:

pop SI

 

 

pop CX

 

 

jcxz m2

; Перехід, якщо досягнуто кінеця рядка.

 

jmp m1

 

m2:

call newline

 

 

cmp BP,0

; Перевіряємо, чи були слова.

 

jne m4

; Слова були.

nwd:

lea DX,p_nw

; Друк рядка «No words».

 

mov AH,09h

 

int 21h

call newline

55

m4: retf

Main

Endp

Code

Ends

 

End Main

Задача 3. Задано рядок, який складається з послідовності

символів та знаків, ознакою закінчення рядка є крапка ('.'). Розробити

програму, яка для

заданого рядка замінює послідовність символів –

"tion" на послідовність – "sh".

Розв’язування.

 

 

Data

Segment

para 'Data'

max

equ

255

 

str_prm

 

db ' Input string ? ','$'

num_fs equ 4

 

 

findw

db 'tion'

 

 

num_rp

equ 2

 

 

replw

 

db 'sh'

rez_prm

db ' Rezult : ', '$'

nums

db ?

 

 

 

strs

db max dup(' ')

newlinecode

db 10,13,'$'

Data

Ends

 

 

 

Code

Segment

para 'code'

 

Assume

cs:Code,ds:Data,es:Data

newline proc near

; Підпрограма переведення курсора

 

push AX

 

; на новий рядок у початкову позицію.

 

push DX

 

 

 

lea DX, newlinecode

 

mov AH,9

 

 

int 21h

 

 

 

pop DX

 

 

 

pop AX

 

 

 

ret

 

 

 

newline

 

endp

 

Main

Proc far

 

 

 

push DS

 

 

 

sub AX,AX

 

 

push AX

 

 

 

mov AX,Data

 

mov DS,AX

 

 

call newline

; Переведення курсора на новий рядок.

56

 

 

 

 

; Виведення на екран повідомлення.
; Переведення курсора на новий рядок.
;Завантажити відносну адресу ; для введення рядка.
; BX - для підрахунку кількості ;введених символів.

lea DX, str_prm; Завантаження відносної адреси повідомлення mov AH,09h

int 21h

call newline mov CX,max lea SI, strs

xor BX, BX

 

mov AH,01h

 

mich:

int 21h

; Посимвольне введення

 

mov [SI],AL

; рядка до символу крапка ('.').

 

inc SI

; Рядок записується у масив strs.

 

inc BX

 

 

cmp AL, '.'

 

 

je mpt

 

 

loop mich

 

mpt:

call newline

 

 

lea DX, rez_prm ; Друк повідомлення – ' Rezult : '

 

mov AH,09h

 

 

int 21h

 

 

call newline

 

 

cmp BX,num_fs ; Порівняння кількості введених символів із

 

 

; довжиною ; шуканої послідовності.

 

jg mc

; Перехід, якщо кількості введених

 

 

; символів більша.

 

mov strs[BX], '$'; Якщо кількість введених

 

 

; символів менша. Дописуємо '$' в кінець рядка.

 

jmp me1

; Перехід на друк.

mc:

mov CX,BX

; Копіювання кількості символів введеного

 

 

; рядка.

 

sub CX, num_fs ; Підготовка до порівняння символів введеного

 

 

; рядка (рядок strs) із шуканою

 

lea SI, strs

; підпослідовністю (рядок findw).

nnb:

lea DI, findw

;

 

xor BX,BX

 

 

push CX

 

 

mov CX,num_fs;

mph:

mov AL,[ SI +BX] ;Цикл по символьного порівняння

 

 

; підрядка з позиції

 

 

57

cmp AL,[DI+BX] ; на яку вказує SI з шуканою послідовністю. jne mnts ; Перехід, якщо символи не збігаються.

inc BX loop mph

;Вихід із циклу. Символи шуканої послідовністі

;(рядок findw) попарно збігаються з

;послідовністю у вхідному рядку.

 

mov CX,num_rp

; Заміна знайденої підпослідовністі

 

 

; новою з рядка replw.

 

xor BX,BX

; За умовою кількість символів послідовністі,

 

lea DI, replw

; що замінуємо більша за кількість символів

 

 

; на які замінюємо (num_fs >num_rp), тому

mrp:

mov AL,[DI+BX]

; замінується послідовності символів,

 

mov [SI+BX],AL

 

 

inc BX

 

 

 

loop mrp

 

 

 

pop CX

; а на позиці, що залишилися (num_fsnum_rp )

 

push CX

; зсувається залишок рядка.

 

mov DI,SI

 

 

 

add DI, num_fsnum_rp

mshf:

mov AL,[DI+num_rp]

 

 

mov [DI],AL

 

 

 

inc DI

 

 

 

loop mshf

 

 

 

pop CX

 

 

 

sub CX, num_fsnum_rp; Зменення кількості

 

 

; елементів послідовності.

 

cmp CX,0

; Перевірка кінця послідовності.

 

je me

; Перехід кінець послідовності.

 

jg me2

; Перехід на наступну ітерацію.

 

dec SI

; Корегування вказівника SI, при

 

jmp me

; виході за межі рядка.

me2:

push CX

 

 

mnts:

pop CX

 

 

 

inc SI

 

 

 

loop nnb

 

 

me:

mov [SI+num_fs],'$';Вставляємо ознаку кінця виведення рядка.

me1:

lea DX,strs

; Друк.

 

 

mov AH,9

 

 

 

int 21h

 

 

58

 

 

 

call newline retf

Main Endp

Code Ends End Main

Завдання для самостійної роботи

I. Задано символьний рядок, який складається з декількох слів (наборів символів), які розділяються не менше ніж одним символом пробілу (' '). Слова у рядку складаються з букв латинського алфавіту. Розробити програму, яка для заданого символьного рядка знаходить:

1)останнє найбільше за довжиною слово;

2)останнє найменше за довжиною слово;

3)перше найменше за довжиною слово;

4)друге найбільше за довжиною слово в порядку розташування, якщо їх декілька;

5)друге найменше за довжиною слово в порядку розташування, якщо їх декілька;

6)перше найменше за довжиною слово з парною кількістю символів;

7)перше найменше за довжиною слово з непарною кількістю символів;

8)перше найбільше за довжиною слово з парною кількістю символів;

9)перше найбільше за довжиною слово з непарною кількістю символів;

10)друге найбільше за довжиною слово з парною кількістю букв у порядку розташування, якщо їх декілька.

II. Задано рядок, який складається із декількох слів (наборів символів), які розділяються не менше ніж одним символом пробілу (' '). Розробити програму, яка для заданого символьного рядка друкує всі :

1)цифри ('0','1',...'9') та знаки : '>','<','=';

2)шістнадцяткові цифри ('0','1',...'9','a'-'f' );

3)цілі числа;

4)слова, які складаються з букв латинського алфавіту;

5)ідентифікатори;

6)слова, які починаються буквами: 'а', 'b', 'c', 'd' i 'e';

59

7)слова, які починаються та закінчуються однаковими символами;

8)слова, які мають префікс "to", "for" та "best";

9)слова, які закінчуються буквами 'e' ,'s' ,'g', 'f', 'm', 'о', i 'l';

10)слова, які мають закінчення "ing","ed" і "less";

III. Задано символьний рядок. Слова та ідентифікатори розділяються хоча б одним сиволом пробілу. Написати програму, яка із заданого символьного рядка вилучає:

1)пробіли (20h), символи табуляції (09h) та символи нового рядока (0ah);

2)символи табуляції (09h), символи новий рядок (0ah) та знаки: ',' , '.';

3)цифри ('0','1',...'9') та знаки: '>', '<', '=';

4)шістнадцяткові цифри ('0', '1', ...'9', 'a'-'f' );

5)кожний п’ятий пробіл;

6)ідентифікатори, які мають більше п’яти символів;

7)слова, які починаються буквами: 'a', 'b', 'c', 'd' i 'e';

8)слова, які починаються та закінчуються однаковими символами;

9)слова, які мають префікс "re", "not" та "be";

10)слова, які закінчуються буквами: 'e', 'g', 'r', 's', 'о', 'k' i 'z';

11)слова, які мають закінчення "ing", ed”, “es”, “lest” і “less”.

IV. Задано символьний рядок. Слова та ідентифікатори розділяються хоча б одним символом пробілу. Написати програму, яка у заданому рядку замінює:

1)п’ять символів пробілу (' ') на символ табуляції (09h);

2)символ табуляція (09h) на пробіли (' ') так, щоб останній пробіл знаходився на позиції, кратній 10. Наприклад: якщо в рядку на двадцять третій позиції знаходиться знак табуляції, то до рядка з тієї ж позиції, де був знак 09h, добавляється сім пробілів;

3)цифри ('0','1',...'9') на символ '*';

4)шістнадцяткові цифри ('0', '1', ..., '9', 'a'-'f' ) на знак '+';

5)послідовність букв в алфавітному порядку на скорочений запис (наприклад: abcdf -> a-f);

6)скорочений запис на послідовність букв (наприклад: c-e -> cdfe, k-t -> klmnoprst);

7)слова, які мають префікс "re","not" на "***";

8)слова, які починаються буквами: 'a', 'b', 'c' на слово, 'bad';

9)послідовність "fedcba" на "аabcdef";

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]