Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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
<< Назад В начало Далее >> |
|