Программирование на Ассемблере


         

Использование команд для работы с блоками


Команды позволяют обрабатывать массив чисел длиной 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.

В этой программе сначала определяется направление копирования. Если области памяти для исходного и результирующего массивов пересекаются, при этом адрес начала результирующего массива больше, чем адрес исходного, необходимо копировать, начиная с конца массива, в противном случае – с начала.



Содержание  Назад  Вперед