Доставка цветов в Севастополе: SevCvety.ru
Главная -> Появление первого микропроцессора

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 [75] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

Поиск заданного байта производится с помощью итеративного цикла, в котором исходный байт последовательно сравнивается с каждым байтом массива. При первом же успешном сравнении осуществляется возврат из программы. Адрес байта, подлежащего сравнению на текущей итерации, располагается в регистровой паре (Н, L), что автоматически обеспечивает требуемое значение выходного параметра при успешном поиске. Выход из цикла вьшолняется при нулевом значении счетчика текущей длины, контролируемого в начале каждой итерации. Программа позволяет обнаружить только первое вхождение искомого кода в заданный массив. Если требуется определить адрес всех байтов, содержащих заданный код, или подсчитать их количество, нужно циклически вызывать указанную программу до тех пор, пока в регистровую пару (Н, L) не будет возвращен признак неудачного поиска.

5.4.4. ПОИСК ПОСЛЕДОВАТЕЛЬНОСТИ КОДОВ В МАССИВЕ

Задача формулируется следующим образом: имеются два массива А и В, причем длина массива А больше длины массива В; необходимо определить местоположение копии массива В в массиве А (если она имеется). Задачу в такой постановке приходится решать, когда требуется отыскать в некоторой строке заданную цепочку символов.

Алгоритм выполнения данной поисковой процедуры заключается в скользящем сравнении массива В с массивом А: массив В сравнивается с начальным фрагментом массива А, начинающегося с первого байта массива А, длина которого равна длине массива В, затем сравнение производится с фрагментом массива А, начинающимся со второго байта этого массива, и т. д. (рис. 5.4). Программа поиска имеет вид:

CPEH2!

; ПОЯПРОГРАМНА ПОИСКА НАССИИЛ "Б" И МАССИВЕ "А". ; ВХОДНЫЕ ПАРАНЕТРЫ: (ВгС)-АДРЕС НАЧАЛА МАССИВА "А"»<Г1,Е) ; - АДРЕС НАЧАЛА МАССИВА "Е"г (ST+1>- ДЛИНА МАССИВА "В", ! (5Т+2)-ЯЛИНА МАССИВА "А",

; ЕЫХОЯНЫЕ ПАРАМЕТРЫ: (h,IJ - АДРЕС ПЕРВОГО ЕАЙТА КОПИИ ; МАССИВА "В" В МАССИВЕ "А" ЕС.ЧИ СНА СУЩЕСТВУЕТ» (h.l)"0-5 Б ПРОТИВНОМ СЛУЧАЕ. . ; ОЦЕНКА: ЕРЕНЯ-4?9+<20й+8?*М)кН ТАКТОБ1ГЯЕ К-К0ЛИЧЕСТЕ8

; ЭЛЕНЕНТОР В МАССИВЕ "Ё"» Н-КО,ЧИЧЕСТЕО ЭЛЕМЕНТОВ В MAC-! СИВЕ "А"; ДЛИНА-81 ЕАИТ»ГЛ,*БИНА СТЕКА-Й ЕАИТ.



СОХРАНЕНИР ИХОЛНЫХ ПАРЙМЕТРОЗ Е СТЕКЕ

214F D5

PUSH

2150 С5

PUSH

; ОПРЕДЕЛЕН! ЧИСЛА СРАВНЕНИИ

XTRN

D.E.3

; (D.E)-ДЛИНА МАССИВА "A"

XTRN

B»Cf4

; (Б.С)-ДЛИНА МАССИВА "В"

216В 79

216С 93

216В 6F

216Е 78

216F 9А

2170 67

; (H.L)-число СРАВНЕНИИ

2171 DS

PUSH

; СОХРАНЕНИЕ ДЛИНЫ МАССИВА

XTRN

D.E.4

; (D.E)-АДРЕС МАССИВА "А"

XTRN

E.C.5

S (Е,С)-АДРЕС МАССИВА "Е"

; СКОЛЬЗЯЩЕЕ

СРАВНЕНИЕ

МАССИВОВ

21ЕС CD2A21

ИИКЛ9! CALL

СРБН1

218F В7

2190 C29D21

ПЕР12

; ЕСЛИ МАССИВЫ РАВНЫ

2193 03

2194 2Е

2195 7D

2196 Б4

2197 С28С21

ЦИКЛ9

! ЕСЛИ СРАВНЕНИЯ НЕОКОИЧЕНО

219А C39F21

ПЕР11

S ЗАГРУЗКА ВЫХОДНОГО ПАРАМЕТРА ПРИ УДАЧНОМ ПОИСКЕ

219В 69

ПЕР12: мои

219Е 60

; ВОССТАНОВЛЕНИЕ ВХОДНЫХ ПАРАМЕТРОВ

219F Б1

ПЕРИ: POP

21А0 С1

21А1 D1

21А2 С9

/ 2


1-е сравнение

2-е сравнение

(т-п)-е сравнение

Рис. 5.4. Схема скользящего сравнения двух массивов.

Необходимое число сравнений для полного поиска определяется разностью длин массивов А и В, которая вычисляется в начальном фрагменте программы. При извлечении значений длин массивов из стека в макрокоман-



де XTRN номер слова в стеке указывается с учетом того, что в начале программы были произведены две загрузки в стек.

Скользящее сравнение массивов организовано в виде итеративного цикла. Сравнение массива В с фрагментом массива А выполняется с помощью подпрограммы CPBHI (она описана на с. 225-226). После каждого вызова подпрограммы анализируется признак результата сравнения, который устанавливается подпрограммой СРВН1 в регистре (А). Если сравнение было успешным, т. е. копия массива В найдена в массиве А, формируется соответствующее значение выходного параметра и осуществляется возврат из программы. В противном случае поиск продолжается, адрес начала очередного фрагмента массива А инкрементируется, а в конце каждой итерации число сравнений декрементируется. Когда оно достигает нулевого значения, выполнение цикла скользящего сравнения прекращается и осуществляется возврат из программы. Полученное нулевое значение используется в качестве индикатора неудачного поиска без дополнительной установки выходного параметра. В программе обеспечено сохранение значений всех входных параметров, передаваемых через регистры и через стек.

5.4.5. ПОИСК ЭЛЕМЕНТА ТАБЛИЦЫ ПО КЛЮЧУ

Ниже описывается процедура поиска элемента простой таблицы, формат которой приведен на рис. 5.5. В таблице, состоящей из т элементов длиной п байт, требуется определить адрес элемента, первый байт которого совпадает с заданным. Поиск заключается в просмотре первых байтов всех элементов и сравнении их значений с заданным. Программа поиска имеет вид:

пскз:

г ПОДПРОГРАНМА ПОИСКА ЭДЕНЕИТА ТАК.ЧИЩ1 ПО КШЧУ. ! ВХОДНЫЕ ПАРАМЕТРЫ! (С) - КОД КДЮЧА ИСКОМОГО ЭДЕНЕНТА» ! (D)-КОЛИЧЕСТВО ЭЛЕМЕНТОВ Б ТАБЛИЦЕ, <Е)-ДЛИНА Э.ЧЕМЕНТА, г (ST+1) - АДРЕС НАЧАЛА ТАБЛИЦЫ.

: ВЫХОДНЫЕ ПАРАМЕТРЫ: (H,L) - АДРЕС ПЕРВОГО ЕАИТА НАЙДЕН-! НОГО ЭЛЕМЕНТА ПРИ УСПЕШНОМ ПОИСКЕ, (H,L>=OFFFFH Е ЛРО-t ТИБНОН СЛУЧАЕ.

! ОЦЕНКА: ВРЕНЯ-101+41«М ТАКТОВ» ГДЕ N - КОЛИЧЕСТВО ЭЛЕ-J МЕНТОВ В ТАБЛИЦЕ; ДЛИНА - 29 ЕАЙТ.

;ххх«х»х»ххх»ххх*»»хххх»»хх»»х»*кх*х*«»ххххх»х«ххх»«»х»к ! СРАВНЕНИЕ КЛЮЧА ЭЛЕМЕНТА ТАБЛИЦЫ С ЗАДАННЫМ 2110 ЕБ XCHG



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 [75] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116



0.0727
Яндекс.Метрика