Команды обработки строк данных
Строкой называют последовательность байтов или слов, размещаемую в смежных ячейках памяти. Примером может служить строка, которая вводится с терминала в ВМ. Операции со строками выполняются над каждым элементом строки (байтом или словом), так что время их выполнения пропорционально числу элементов в строке. В ЦП имеется несколько однобайтных команд, выполняющих простые операции над строками. Эти команды значительно ускоряют манипуляции над строками благодаря уменьшению времени, затрачиваемого на обработку каждого элемента и на вспомогательные действия, которые необходимо выполнять между обработкой последовательных элементов. К вспомогательным действиям относятся: переадресация элемента строки, уменьшение на единицу счетчика числа обрабатываемых элементов и проверка достижения счетчиком нуля.
Для иллюстрации временных затрат на обработку одного элемента строки рассмотрим процесс пересылки строки из одной области памяти в другую. Для указания начального адреса первого элемента исходной строки и строки результата используются регистры 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; просмотров: 770;