Пересылка цепочки:
MOVS адрес_приемника, адрес_источника — переслать цепочку (MOVe String);
MOVSB — переслать цепочку байтов;
MOVSW — переслать цепочку слов;
MOVSD — переслать цепочку двойных слов.
Команда копирует байт, слово или двойное слово из цепочки, адресуемой ds:si, в цепочку, адресуемую ds:si (Для MOVS адреса приемника и источника указываются при вызове )
Алгоритм работы:
- выполнить копирование байта, слова или двойного слова из операнда источника в операнд приемник, при этом адреса элементов предварительно должны быть загружены:
- в зависимости от состояния флага df изменить значение регистров esi/si и edi/di
- если есть префикс повторения, то выполнить определяемые им действия
- Состояние флагов после выполнения команды: не влияет на флаги
o адрес источника — в пару регистров ds:esi/si (ds по умолчанию, допускается замена сегмента);
o адрес приемника — в пару регистров es: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
Алгоритм работы:
- выполнить вычитание элементов (источник — приемник), адреса элементов предварительно должны быть загружены:
- в зависимости от состояния флага df изменить значение регистров esi/si и edi/di
- в зависимости от результата вычитания установить флаги:
- при наличии префикса выполнить определяемые им действия.
o адрес источника — в пару регистров ds:esi/si;
o адрес назначения — в пару регистров es: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:
- при наличии префикса выполнить определяемые им действия .
- Состояние флагов после выполнения команды:не влияет на флаги.
Набор команд процессора имеет соответствующие машинные команды только для цепочечных команд ассемблера без операндов. Команды с операндами транслятор ассемблера задействует только для определения типов операндов. После того как выяснен тип элементов цепочек по их описанию в памяти, генерируется одна из трех машинных команд для каждой из цепочечных операций. По этой причине все регистры, содержащие адреса цепочек, должны быть инициализированы заранее, в том числе и для команд, допускающих явное указание операндов.