Разделы:


Best links:

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

   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 - автоинкрементирование.

предыдущаяследующая