M_Asm2009LS
.pdfm0: |
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 |
|
|
|
|
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