Префиксы повторения
Т. к. смысл использования строковых команд заключается в организации циклов, специально для них предусмотрены префиксы повторения. Префикс повторения 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. Определить, входит ли в строку А подстрока Б? Строки А и Б описать в сегменте данных. Результат работы программы – текст соответствующего сообщения.
