Команды обработки строк данных


Строкой называют последовательность байтов или слов, раз­мещаемую в смежных ячейках памяти. Примером может служить строка, которая вводится с терминала в ВМ. Операции со строками выполняются над каждым элементом строки (байтом или словом), так что время их выполнения пропорционально числу элементов в строке. В ЦП имеется несколько однобайт­ных команд, выполняющих простые операции над строками. Эти команды значительно ускоряют манипуляции над строками бла­годаря уменьшению времени, затрачиваемого на обработку каж­дого элемента и на вспомогательные действия, которые необхо­димо выполнять между обработкой последовательных элементов. К вспомогательным действиям относятся: переадресация элемента строки, уменьшение на единицу счетчика числа обрабаты­ваемых элементов и проверка достижения счетчиком нуля.

Для иллюстрации временных затрат на обработку одного элемента строки рассмотрим процесс пересылки строки из одной области памяти в другую. Для указания начального адреса пер­вого элемента исходной строки и строки результата используют­ся регистры SI (индекс источника) и DI (индекс места назначе­ния) соответственно, число пересылаемых элементов задается в регистре-счетчике СХ. Пересылка строки заключается в выпол­нении следующих шагов (при описании каждого шага указана соответствующая команда):

1: JCXZ Exit ; если СХ=0, то пересылка закончена

2: MOV AL, [SI] ; переслать байт из в AL

3: MOV [DI], AL ; запомнить содержимое AL в памяти

4: INC SI ; увеличить SI на «1»

5: INC DI ; увеличить DI на «1»

6: DEC СХ ; уменьшить СХ на «1»

7: JNZ 1 ; перейти к шагу 1.

Собственно пересылка байта выполняется на шагах 2 и 3. На шагах 4 и 5 осуществляется вычисление адресов источника и места назначения для следующего элемента строки. Наконец, шаги 1, 6 и 7 служат для определения числа обработанных эле­ментов.

Действия, которые выполняются с помощью указанных че­тырех команд на протяжении шагов 2-5, могут быть выполне­ны с помощью одной команды MOVS (переслать элемент стро­ки). Для организации циклического исполнения команды MOVS (а также других команд обработки строк) используется одно­байтовая команда-префикс REP (повторить). Она записывается перед основной командой (например, REP MOVS) и обеспечи­вает ее выполнение N раз. Число повторений N предварительно записывается в регистр СХ и на каждом шаге содержимое СХ уменьшается на единицу. Используются три мнемокода команды-префикса: REP, REPNE/REPNZ и REPE/REPZ. Первый мнемо­код анализирует только одно условие окончания повторений: (СХ)=0. В тех случаях, когда возникает необходимость допол­нительно анализировать условие ZF=0 (или ZF=1), исполь­зуется второй (или третий) мнемокод. Команда REP позволяет еще больше сократить время на обработку элементов строки за счет совмещения операций (СХ) = (СХ) - 1 с проверкой дости­жения счетчиком нуля. Так, совокупность действий, выполня­емых за семь указанных выше шагов, может быть выполнена командой MOVS с префиксом REP.

В ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего ее эле­мента. Например, требуется переслать строку, содержащую 10 байт и расположенную в памяти, с относительного адреса (SI) = 200 по (SI) = 209 в область памяти с относительного ад­реса (DI)=205 no (DI) =214. Ясно, что такую пересылку нель­зя выполнять начиная с первого элемента, так как области па­мяти с исходной строкой и строкой-результатом перекрываются и первая же пересылка «испортит» значение пятого элемента ис­ходной строки. Требуемую пересылку строк можно осуществить начиная с последнего элемента исходной строки. В этом случае следует установить начальные адреса элементов строк равными (SI) =205 и (DI) =214. Кроме того, при пересылке каждого элемента необходимо не увеличивать, а уменьшать на единицу содержимое индексных регистров SI и DI. Направление переда­чи устанавливается с помощью флага DF: при значении DF=1 происходит автодекрементирование индексных регистров, а при значении DF=0 - автоинкрементирование.

Когда в качестве элементов строк используются не байты, а слова, соответствующее увеличение или уменьшение значений индексных регистров осуществляется на два, т. е. при DF=1: SI = SI - 2; DI = DI - 2, а при DF=0: SI = SI + 2, DI = DI + 2.

Кроме команды MOVS для действия со строками имеется еще четыре команды: CMPS (сравнение элементов строк), SCAS (сканирование элементов строки), LODS (загрузка эле­мента строки) и STOS (заполнение элемента строки).

Команда CMPS позволяет осуществить поэлементное сравне­ние двух строк, одна из которых располагается в памяти с отно­сительного адреса, указанного в SI, а вторая - с относительного адреса, указанного в DI. По команде CMPS производится вы­читание элемента строки с адресом в SI из элемента строки с ад­ресом в DI. Как обычно, при выполнении операции сравнения результат вычитания не фиксируется, а устанавливаются соот­ветствующие значения флагов, по которым определяется резуль­тат сравнения. По аналогии с командой MOVS при сравнении изменяются значения индексных регистров по правилу: SI = SI ± А; DI = DI ± A, где « + » - используется при DF=0; «-» - при DF=1; А=1- при w = 0; А = 2 при w=1.

Для циклического повторения команды CMPS используется префикс повторения REPNE/REPNZ или REPE/REPZ.

По команде сканирования SCAS производится сравнение зна­чения элемента строки, расположенной с относительного адреса, который указан в DI, со значением AL. При этом также осуще­ствляется операция вычитания, результат которой не фиксирует­ся. Одно из возможных применений команды сканирования со­стоит в отыскании элемента строки, равного заданному образцу.

Образцовый элемент загружается в AL и затем организуется цикл сканирования с использованием префикса повторения REPE/REPZ. Как и при выполнении предыдущих команд, каж­дый раз по команде SCAS производится автоинкремент (или автодекремент) адреса элемента: (DI) = (DI) ± A.

Две следующие команды LODS (загрузка элемента строки) и STOS (запись элемента строки) позволяют загружать элемен­ты строки в аккумулятор и записывать содержимое аккумулято­ра в строку. При выполнении этих команд осуществляется под­готовка адреса следующего элемента строки, т. е. модифициру­ется содержимое соответствующего индексного регистра. Однако повторение команды LODS обычно не используется, а повторе­ние команды STOS, организуемое с помощью префикса REP, применяется при загрузке строки константой, предварительно помещенной в аккумулятор.

Рассмотренные выше команды работы со строками реализуют относительно простые операции, на базе которых можно органи­зовать более сложные операции обработки строк.



Дата добавления: 2018-11-26; просмотров: 761;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.