
Префиксы повторения
Т. к. смысл использования строковых команд заключается в организации циклов, специально для них предусмотреныпрефиксы повторения. Префикс повторенияrep (repeat – повторить) заставляет процессорn раз повторить указанную строковую команду. Количество повторенийn должно быть заранее загружено в регистр-счетчикCX. При каждом повторении содержимоеCX декрементируется и при достижении им нуля цикл завершается.
Пример:
mov di,offset buf ; загрузка адреса буфера (ES уже должен быть загружен)
mov cx,20 ; количество повторений (длина цепочки)
mov al,’0’ ; шаблон-заполнитель
rep stosb ; повторение (заполнение буфера шаблоном)
Наряду с мнемоникой префикса rep используются мнемоникиrepe (repz) иrepne (repnz), которые обозначают повторение с возможностью досрочного завершения цикла. Префиксrepe/repz (repeat until equal – повторять, пока равно), применяемый с командами cmps, scas, завершает цикл по первому несовпадению сравниваемых элементов. Префиксrepne/repnz, соответственно, завершает цикл при первом совпадении. Т. к. после выхода из цикла необходимо знать: завершился ли цикл по счетчику (cx=0) или досрочно (по признакуzf), для этого предусмотрена командаjcxz (jump if cx zero), по которой выполняется анализ содержимого счетчикаcx на ноль.
Пример программы
Ниже приведен пример программы на языке Ассемблер, выполняющей пересылку байтов из массива (строки) источника str1 в массив (строку) приемникаstr2. Пересылаются 10 байтов.
name strings
.model small
.stack
.data
str1 db '0123456789012345'
str2 db '****************'
.code
;---------------------
start:
mov ax,@data
mov ds,ax
mov es,ax ;
ES:=DS
assume es:@data
cld
mov cx,10
mov si,offset
str1
mov di,offset
str2
rep movs str2,str1
.exit
;---------------------
end start
С
С
Порядок выполнения работы
Создайте исходный модуль ggnn_st1.asm, выполняющий действия над строками согласно варианту (gg –последние цифры номера группы,nn – номер в группе).
Выполните трансляцию модуля в ggnn_st1.exe
Загрузите исполняемый модуль в отладчик и выполните в пошаговом режиме.
Проделайте п.п. 1-3 для модулей ggnn_st2.asm,ggnn_st3.asm.
Результаты отразите в отчете.
Содержание отчета
Исходные тексты программ.
Алгоритм работы третьего модуля
Выводы.
Варианты заданий
№/№ вар. зад. |
Длина 1 |
Нач. поз. 1 |
Длина 2 |
Нач. поз. 2 |
Кол. |
Примечание |
1.1 |
33 |
5 |
44 |
9 |
12 |
Пересылка байтов |
1.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
1.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
2.1 |
22 |
3 |
33 |
10 |
15 |
Пересылка байтов |
2.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
2.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
3.1 |
44 |
4 |
22 |
11 |
10 |
Пересылка слов |
3.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
3.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
4.1 |
23 |
2 |
66 |
1 |
18 |
Пересылка слов |
4.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
4.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
5.1 |
25 |
6 |
64 |
2 |
12 |
Пересылка байтов |
5.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
5.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
6.1 |
27 |
7 |
62 |
3 |
11 |
Пересылка байтов |
6.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
6.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
7.1 |
29 |
8 |
60 |
4 |
13 |
Пересылка слов |
7.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
7.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
8.1 |
31 |
9 |
58 |
5 |
16 |
Пересылка слов |
8.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
8.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
9.1 |
33 |
10 |
56 |
6 |
19 |
Пересылка байтов |
9.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
9.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
10.1 |
35 |
9 |
54 |
7 |
10 |
Пересылка байтов |
10.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
10.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
11.1 |
37 |
8 |
52 |
8 |
13 |
Пересылка слов |
11.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
11.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
12.1 |
39 |
7 |
50 |
9 |
15 |
Пересылка слов |
12.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
12.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
13.1 |
41 |
6 |
48 |
10 |
18 |
Пересылка байтов |
13.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
13.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
14.1 |
43 |
5 |
46 |
11 |
20 |
Пересылка байтов |
14.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
14.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
15.1 |
45 |
4 |
44 |
1 |
22 |
Пересылка слов |
15.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
15.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
16.1 |
47 |
3 |
42 |
2 |
23 |
Пересылка слов |
16.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
16.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
17.1 |
49 |
2 |
40 |
3 |
24 |
Пересылка байтов |
17.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
17.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
18.1 |
51 |
1 |
38 |
4 |
8 |
Пересылка байтов |
18.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
18.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
19.1 |
53 |
11 |
36 |
5 |
4 |
Пересылка слов |
19.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
19.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
20.1 |
55 |
10 |
34 |
6 |
7 |
Пересылка слов |
20.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
20.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
21.1 |
57 |
9 |
32 |
7 |
12 |
Пересылка байтов |
21.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
21.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
22.1 |
59 |
8 |
30 |
8 |
15 |
Пересылка байтов |
22.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
22.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
23.1 |
61 |
7 |
28 |
9 |
17 |
Пересылка слов |
23.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
23.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
24.1 |
63 |
6 |
26 |
10 |
19 |
Пересылка слов |
24.2 |
Сколько раз введенный символ: |
совпадает с байтами строки | ||||
24.3 |
Поиск подстроки в строке |
| ||||
|
|
| ||||
25.1 |
65 |
5 |
24 |
11 |
6 |
Пересылка байтов |
25.2 |
Сколько раз введенный символ: |
не совпадает с байтами строки | ||||
25.3 |
Поиск подстроки в строке |
| ||||
|
|
|
Задание 1. Выполнить пересылку элементов строк (массивов) в соответствии с вариантом. Массивы описать в сегменте данных.
Задание 2. Программа вводит символ с клавиатуры и определяет, сколько раз он совпадает (или не совпадает с байтами строки). Строку описать в сегменте данных.
Задание 3. Определить, входит ли в строку А подстрока Б? Строки А и Б описать в сегменте данных. Результат работы программы – текст соответствующего сообщения.