21. Цепочечные команды

Пересылка цепочки:
MOVS адрес_приемника, адрес_источника — переслать цепочку (MOVe String);
MOVSB — переслать цепочку байтов;
MOVSW — переслать цепочку слов;
MOVSD — переслать цепочку двойных слов.
Команда копирует байт, слово или двойное слово из цепочки, адресуемой ds:si, в цепочку, адресуемую ds:si (Для MOVS адреса приемника и источника указываются при вызове )

Алгоритм работы:

  • выполнить копирование байта, слова или двойного слова из операнда источника в операнд приемник, при этом адреса элементов предварительно должны быть загружены:
  • o адрес источника — в пару регистров ds:esi/si (ds по умолчанию, допускается замена сегмента);
    o адрес приемника — в пару регистров es:edi/di (замена сегмента не допускается);

  • в зависимости от состояния флага df изменить значение регистров esi/si и edi/di
  • если есть префикс повторения, то выполнить определяемые им действия
  • Состояние флагов после выполнения команды: не влияет на флаги



Сравнение цепочек:
CMPS адрес_приемника, адрес_источника — сравнить строки (CoMPare String);
CMPSB — сравнить строку байтов;
CMPSW — сравнить строку слов;
CMPSD — сравнить строку двойных слов.
Команды, реализующие операцию-примитив сравнения цепочек, производят сравнение элементов, находящиеся по адресу ds:si, с элементами по es:di (Для CMPS адреса приемника и источника указываются при вызове )

Пример:
Mov esi,OFFSET source
mov edi,OFFSET target
cmpsd				;сравним двойные слова
ja L1				;переход, если source>target
jmp L2				;переход, если source<=target

Алгоритм работы:

  • выполнить вычитание элементов (источник — приемник), адреса элементов предварительно должны быть загружены:
  • o адрес источника — в пару регистров ds:esi/si;
    o адрес назначения — в пару регистров es:edi/di;

  • в зависимости от состояния флага df изменить значение регистров esi/si и edi/di
  • в зависимости от результата вычитания установить флаги:
  • o если очередные элементы цепочек не равны, то cf=1, zf=0;
    o если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;

  • при наличии префикса выполнить определяемые им действия.



Сканирование цепочки:
SCAS адрес_приемника — сканировать цепочку (SCAning String);
SCASB — сканировать цепочку байтов;
SCASW — сканировать цепочку слов;
SCASD — сканировать цепочку двойных слов.
Команды, реализующие операцию-примитив сканирования цепочек, производят поиск значения, находящегося в регистре AL, AX или EAX (в зависимости от размера) по адресу es:di. (Для SCAS адрес сканируемой строки указывается при вызове).

Пр.
Mov edi,OFFSET alpha		;загрузка в EDI адреса строки alpha
mov al,’F’				;загрузка в AL ASCII-кода символа ‘F’
move cx, LENGTHOF alpha	;загрузка в ECX длины строки alpha
cld						;направление сравнения восходящее
repne scasb				;сканируем строку до нахождения символа ‘F’
jnz quit					;выход в случае ненахождения
dec edi					;символ найден, в EDI его адрес

Алгоритм работы:

  • выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;
  • по результату вычитания установить флаги;
  • изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df



Загрузка элемента из цепочки:
LODS адрес_источника — загрузить элемент из цепочки (LOaD String) в регистр- аккумулятор AL/AX/EAX;
LODSB — загрузить байт из цепочки в регистр AL;
LODSW — загрузить слово из цепочки в регистр АХ;
LODSD — загрузить двойное слово из цепочки в регистр ЕАХ.
Операция-примитив загрузки элемента цепочки в аккумулятор позволяет извлечь элемент по адресу ds:si (Для LODS адрес строки источника указывается при вызове) и поместить его в регистр-аккумулятор AL, АХ или ЕАХ.

Алгоритм работы:

  • загрузить элемент из ячейки памяти, адресуемой парой ds:esi/si, в регистр al/ax/eax. Размер элемента определяется неявно (для команды lods) или явно в соответствии с применяемой командой (для команд lodsb, lodsw, lodsd);
  • изменить значение регистра si на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df
  • Состояние флагов после выполнения команды:не влияет на флаги.



Сохранение элемента в цепочке:
STOS адрес_приемника — сохранить в цепочке элемент (STOre String) из регистра-аккумулятора AL/AX/EAX;
STOSB — сохранить в цепочке байт из регистра AL;
STOSW — сохранить в цепочке слово из регистра АХ;
STOSD — сохранить в цепочке двойное слово из регистра ЕАХ.
Операция-примитив переноса элемента из аккумулятора в цепочку позволяет сохранить значение из регистра-аккумулятора в элементе по адресу es:di (Для STOS адрес строки-приемника указывается при вызове).

Алгоритм работы:

  • записать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi. Размер элемента определяется неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd);
  • изменить значение регистра di на величину, равную длине элемента цепочки. Знак этого изменения зависит от состояния флага df
  • Состояние флагов после выполнения команды: не влияет на флаги.



Получение элементов цепочки из порта ввода-вывода:
INS адрес_приемника, номер_порта — ввести из порта цепочку (Input String);
INSB — ввести из порта цепочку байтов;
INSW — ввести из порта цепочку слов;
INSD — ввести из порта цепочку двойных слов.
Эта команда вводит элемент из порта, номер которого находится в регистре DX, в элемент цепочки по адресу es:di. (Для INS адрес строки-приемника и номер порта указывается при вызове).
Алгоритм работы:

  • передать данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di;
  • в зависимости от состояния флага df изменить значение регистров edi/di:
  • при наличии префикса выполнить определяемые им действия.
  • Состояние флагов после выполнения команды:не влияет на флаги.



Вывод элементов цепочки в порт ввода-вывода:
OUTS адрес_источника, номер_порта — вывести цепочку в порт ввода-вывода(Output String);
OUTBS — вывести цепочку байтов в порт ввода-вывода;
OUTWS — вывести цепочку слов в порт ввода-вывода;
OUTDS — вывести цепочку двойных слов в порт ввода-вывода.
Эта команда выводит элемент по адресу ds:si в порт, номер которого находится в регистре DX. (Для OUTS адрес строки-источника и номер порта указывается при вызове).
Алгоритм работы:

  • передать данные в порт ввода-вывода, номер которого загружен в регистр dx, из ячейки памяти по адресу ds:esi/si;
  • в зависимости от состояния флага df изменить значение регистров esi/si:
  • при наличии префикса выполнить определяемые им действия .
  • Состояние флагов после выполнения команды:не влияет на флаги.



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

17.07.2015