Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4 ПА.doc
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
297.98 Кб
Скачать

Префиксы повторения

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

С

егмент данных до выполнения rep movs:

С

егмент данных после выполнения rep movs:

Порядок выполнения работы

  1. Создайте исходный модуль ggnn_st1.asm, выполняющий действия над строками согласно варианту (gg –последние цифры номера группы, nn – номер в группе).

  2. Выполните трансляцию модуля в ggnn_st1.exe

  3. Загрузите исполняемый модуль в отладчик и выполните в пошаговом режиме.

  4. Проделайте п.п. 1-3 для модулей ggnn_st2.asm, ggnn_st3.asm.

  5. Результаты отразите в отчете.

Содержание отчета

  1. Исходные тексты программ.

  2. Алгоритм работы третьего модуля

  3. Выводы.

Варианты заданий

№/№ вар. зад.

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