Команды позволяют обрабатывать массив чисел длиной 1, 2, 4 байтов, начиная с начала или конца массива. При этом автоматически изменяется адрес элемента массива на длину элемента массива. Для массива можно выполнить следующие операции:
копирование массива в другой массив:
сравнение двух массивов;
заполнение массива заданным значением или последовательным чтением элементов массива;
поиск заданного элемента массива.
Для определения направления поиска устанавливается флаг d регистра флагов (бит № 10).
Адрес исходного массива задается в регистре ESI, а результирующего - в регистре EDI.
Количество элементов массива задается в регистре ECX.
Команды :
MOVS{B|W|D} - do{*(edi++) = *(esi++) while (ecx--);}
LODS{B|W|D} {AL|AX|EAX} = *(esi++)
STOS{B|W|D} *(edi++) = {AL|AX|EAX}
CMPS{B|W|D} сравнение *(esi++) и *(edi++)
SCAS{B|W|D} do{ if {AL|AX|EAX} = (!=) ) *(edi++) break; while (ecx--);
В таблице 7.1 представлена сводная таблица команд для работы с блоками
Таблица 7.1. Сводная таблица команд для работы с блоками
Код |
Выполняемые действия |
Подготовка команды |
Используемый префикс |
MOVS |
dest = src |
cld (std); esi = &src[10] edi = & dest ecx = number |
REP |
LODS |
{al, ax, eax} = *esi++ |
cld (std); esi = &src |
Префикс не используется |
STOS |
*edi++ = {al, ax, eax} |
cld (std); edi = &dest ecx = number |
REP |
CMPS |
*src ++ <>*dest++ |
cld (std); esi = &src7 edi = & dest ecx = number |
REPE, REPNE |
SCAS |
{al, ax, eax} <> *dest++ |
EAX - что ищем, edi = & dest (где ищем) ecx = number |
REPE, REPNE |
Примеры использования команд
Скопировать область памяти заданной длины в другую область памяти, если адрес начала первой области f1, ее размер len байт, адрес начала второй области f2. Пусть len кратно 4.
В этой программе сначала определяется направление копирования. Если области памяти для исходного и результирующего массивов пересекаются, при этом адрес начала результирующего массива больше, чем адрес исходного, необходимо копировать, начиная с конца массива, в противном случае – с начала.