Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





В этом фрагменте кода элементы массива-источника SARRAY записываются в массив-приемник DARRAY, начиная с позиции четвертого элемента приемника. В регистры E S I и EDI мы помещаем, как обычно, адреса первых элементов этих массивов, а в регистр ЕСХ — количество записываемых элементов. В данном случае регистр ЕСХ содержит размер массива-источника SARRAY.

Поскольку необходимо поместить элементы источника в приемник начиная с четвертого элемента, то значение адреса в регистре EDI необходимо сместить на величину LenD, которая в нашем случае равна 12.
После выполнения операции копирования командой rep movsd массив DARRAY содержит элементы:
11 12 13 498 -27 31 -99 -36 728 -20

Другой распространенной операцией над строками и массивами является сравнение. Для сравнения элементов строк и массивов используется команда cmps и ее модификации. Следующий фрагмент программного кода (листинг 2.33) сравнивает две строки символов.
Листинг 2.33. Фрагмент кода, выполняющий сравнение двух строк
SRC DB "STRING 1 "
LSRC EQU $-SRC
DST DB "STRING 1"
LDST EQU $-DST
FLAG DD 0
eld
lea E S I , SRC
lea EDI, DST
mov ECX, LSRC
mov EDX, LDST
cmp ECX, EDX
je next check
jmp continue
next_check:
repe cmpsb
je equal
mov EAX, FLAG
jmp continue
equal:
mov FLAG, 1
continue:

В этом фрагменте кода используется команда cmpsb, т. к. сравнение выполняется побайтно, с префиксом повторения гере. Если строки одинаковы, то переменной FLAG присваивается значение 1, а если не равны — то 0. В этом примере строки не равны, поэтому переменная FLAG будет сброшена в 0. Фрагмент программного кода для сравнения массивов целых чисел приведен в листинге 2.34.
Листинг 2,34. Фрагмент кода, выполняющий сравнение массивов целых чисел
ISRC DD 3, 16, 89, 11
LISRC EQU ( $ - I S R C ) / 4
IDST DD 3, 16, 89, 1 1 , 9
LIDST EQU ( $ - I D S T ) / 4
FLAG DD
eld
lea ESI, ISRC
lea EDI, IDST
mov ECX, LISRC
mov EDX, LIDST
cmp ЕСХ, EDX
je next_check
jmp continue
next_check:
repe cmpsd
je equal
mov EAX, FLAG
jmp continue
equal:
mov FLAG, 1
continue:

Различия в программных кодах для обработки массивов целых чисел и байтов связаны, прежде всего, с размерностью операндов. Поскольку целые числа занимают в памяти 4 байта, то вместо cmpsb необходимо использовать команду cmpsd для сравнения двойных слов. В регистр ЕСХ по-прежнему заносим размер исходного массива, но теперь эта величина выражена количеством двойных слов. Вот почему мы делим полученные значения на 4.
ISRC DD 3, 16, 89, 11
LISRC EQU ( $ - I S R C ) / 4
IDST DD 3, 16, 89, 1 1 , 9
LIDST EQU ( $ - I D S T ) / 4

Еще один полезный пример — заполнение области памяти определенным символом или числом. Чтобы заполнить, например, символьную строку пробелами, можно написать код, приведенный в листинге 2.35.
Листинг 2.35. Фрагмент кода, заполняющего символьную строку пробелами
SRC DB "Эта строка будет заполнена пробелами"
LSRC EQU $-SRC
eld
mov AL, ' '
mov ECX, LSRC
lea EDI, SRC
rep stosb

Чтобы заполнить массив целых чисел нулями, необходимо использовать фрагмент кода, представленного в листинге 2.36.
Листинг 2.36. Фрагмент кода, заполняющего целочисленный массив нулями
ISRC DD 3, 16, 89, 11, -99, 4
LISRC EQU ($-ISRC)/4
eld
lea EDI, ISRC
mov ECX, LISRC
mov EAX, 0
rep stosd


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru