План Язык программирования Ассемблер и его возможности


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


Download 95.62 Kb.
bet11/12
Sana17.06.2023
Hajmi95.62 Kb.
#1549318
TuriЛекция
1   ...   4   5   6   7   8   9   10   11   12
Bog'liq
Лекция №17b

    Bu sahifa navigatsiya:
  • MOVSB
Цепочечные (строковые) операторы
Такие операторы предназначены для того, чтобы обрабатывать одной инструкцией последовательности из нескольких байт или слов. В результате программа становится короче.
Существуют пять групп цепочечных операторов. Из них далее рассматриваются лишь операторы пересылки строк. Это следующие операторы.
MOVSB – переслать цепочку байт. Оператор не имеет операндов. Ему может предшествовать префикс REP.
При отсутствии префикса оператор копирует всего один байт, расположенный в сегменте данных, в байт, принадлежащий дополнительному сегменту. Как задать байт в сегменте длиной 64 Кбайта? Для этого используются индексные регистры SI и DI. Регистр SI содержит номер (индекс) байта в сегменте данных, a DI – номер байта в дополнительном сегменте. В результате выполнения оператора происходит не только копирование байта, но и изменение на единицу содержимого регистров SI и DI. Направление изменения (увеличение или уменьшение) определяется флагом направления DF в регистре FLAGS. Если DF = 0, то адреса увеличиваются, а если 1, то уменьшаются.
Добавление к оператору MOVSB (как и к любому другому строковому оператору пересылки) префикса повторения команды REP многократно усиливает мощность строковой инструкции. При этом оператор MOVSB выполняется столько раз, каково содержимое регистра СХ. При каждом выполнении содержимое СХ уменьшается на единицу. Как только это содержимое станет равно нулю, то выполняется следующий за MOVSB оператор. Применение оператора MOVSB с префиксом REP требует выполнения следующих пяти шагов:
1.обнулить флаг DF (оператором CLD) или установить его (оператором STD) в зависимости от того, будет ли пересылка осуществляться от младших адресов к старшим или наоборот;
2.загрузить смещение адреса строки-источника в регистр SI;
3.загрузить смещение адреса строки-приемника в регистр DI;
4.загрузить число пересылаемых байтов в регистр СХ;
5.выполнить оператор MOVSB с префиксом REP.
Первый пример.
Следующий фрагмент программы копирует 100 байтов из строки Source, находящейся
всегменте данных, в строку Dest, находящуюся в дополнительном сегменте.
CLD ; 0->DF
LEA SI, Source ; Смещение адреса Source -> SI LEA DI, ES:Dest ; Смещение адреса Dest -> DI MOV CX, 100 ; Число пересылаемых байтов REP MOVSB ; Копирование цепочки байтов
Второй пример.
Следующая процедура выполняет копирование цепочки 256 байтов, находящейся в сегменте данных, в цепочку этой же длины, но расположенную в дополнительном сегменте.
Копирование 256-байтов
Входы: SI – содержит смещение адреса цепочки-источника DI – содержит смещение адреса цепочки-приемника PUSH СХ ;(СХ) -> стек
PUSHF;(FLAGS) -> стек CLD;0 -> DF
MOV CX, 256 ;Счетчик байтов
REP MOVSB ;Копирование цепочки байтов POPF ;Восстановление FLAGS
POP СХ ;Восстановление СХ
RET ;Возврат из процедуры
Т.к. флаг направления может использоваться и в программе, вызывающей нашу процедуру, то надо временно сохранить его в стеке. Для этого используются инструкции FUSHF и POPF, выполняющие запись в стек и извлечение оттуда содержимого регистра FLAGS.
2)MOVSW – пересылка цепочки слов. Данный оператор копирует цепочку слов из сегмента данных в цепочку, расположенную в дополнительном сегменте. Детали применения данного оператора аналогичны оператору MOVSB.



Download 95.62 Kb.

Do'stlaringiz bilan baham:
1   ...   4   5   6   7   8   9   10   11   12




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling