Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.2.6. Цепочечные (строковые) операторы

Такие операторы предназначены для того, чтобы обрабатывать одной командой последовательности из нескольких байт или слов. В результате программа становится короче.

Существуют пять групп цепочечных операторов. Из них далее рассматриваются лишь операторы пересылки строк. Это следующие операторы.

1) movsbпереслать цепочку байт. Оператор не имеет  операндов. Ему может предшествовать префикс rep.

При отсутствии префикса оператор копирует всего один байт, расположенный в сегменте данных, в байт, принадлежащий дополнительному сегменту. Как задать  байт в сегменте длиной 64 Кбайта? Для этого используются индексные регистры SI и DI. Регистр SI содержит номер (индекс) байта в сегменте данных, а DI – номер байта в дополнительном сегменте. В результате выполнения оператора происходит не только копирование байта, но и изменение на единицу содержимого регистров SI и DI. Направление изменения (увеличение или уменьшение) определяется флагом направления DF в регистре FLAGS. Если DF = 0, то адреса увеличиваются, а если 1, то уменьшаются.

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

1) обнулить флаг DF (оператором cld) или установить его (оператором std) в зависимости от того, будет ли пересылка осуществляться от младших адресов к старшим или наоборот;

2) загрузить смещение адреса строки-источника в регистр SI;

3) загрузить смещение адреса строки-приемника в регистр DI;

4) загрузить число пересылаемых байтов в регистр CX;

5) выполнить оператор movsb с префиксом rep.

Пример 1. Следующий фрагмент программы копирует 100 байтов из строки Source, находящейся в сегменте данных, в строку Dest, находящуюся в дополнительном сегменте.

 

cld                                          ;      0 à DF

lea     si, [Source]                   ;  Адрес-смещение Source  à  SI

lea     di, [es:Dest]                  ;  Адрес-смещение Dest à  DI

mov   cx, 100                          ;  Число пересылаемых байтов  

rep      movsb                         ;   Копирование цепочки байтов

 

Пример 2. Следующая процедура выполняет копирование цепочки 256 байтов, находящейся в сегменте данных, в цепочку этой же длины, но расположенную в дополнительном сегменте.

 

;                       Копирование 256-байтов

;                       --------------------------------

;      Входы :  SI – содержит смещение адреса цепочки-источника

;                     DI – содержит смещение адреса цепочки-приемника

;

push  cx                                  ;        (CX)  à стек

pushf                                      ;        (FLAGS) à стек

cld                                          ;         0 à DF

mov   cx, 256                          ;  Счетчик байтов

rep    movsb                           ;  Копирование цепочки байтов

popf                                       ;  Восстановление  FLAGS

pop   cx                                 ;  Восстановление  CX

ret                                        ;  Возврат из процедуры

   

Т.к. флаг направления может использоваться и в программе, вызывающей нашу процедуру, то надо временно сохранить его в стеке. Для этого используются операторы pushf и popf, выполняющие запись в стек и извлечение оттуда содержимого регистра FLAGS.

2) movsw – пересылка цепочки слов. Данный оператор копирует цепочку слов из сегмента данных в цепочку, расположенную в дополнительном сегменте. Детали применения данного оператора аналогичны оператору movsb.

 


Предыдущий раздел В начало Следующий раздел