Команды позволяют обрабатывать массив чисел длиной 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.
В этой программе сначала определяется направление копирования. Если области памяти для исходного и результирующего массивов пересекаются, при этом адрес начала результирующего массива больше, чем адрес исходного, необходимо копировать, начиная с конца массива, в противном случае – с начала.