Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Перед началом операции копирования необходимо установить флаг направления
так, чтобы адреса источника и приемника увеличивались после каждой
итерации. Для этого нужно установить флаг в положение о командой с i d .
Операция копирования выполняется двумя командами: lodsb и stosb. Чтобы
скопировать строку, необходимо организовать цикл, например при помощи
команды loop. В регистре ЕСХ содержится размер строки srcStr. Команда
lodsb загружает байт из ячейки по адресу EST. (строка s rest г) в
аккумулятор AL, а команда stosb записывает полученный байт из аккумулятора
в ячейку памяти по адресу, содержащемуся в регистре EDI (строка
dststr). После операции чтения-записи содержимое регистров EST. И EDI
автоматически инкрементируется на 1. Величина инкремента в этом случае
определяется типом строковой команды. В программе копируются байты,
поэтому и адреса будут увеличиваться на 1. Для того чтобы этот фрагмент
кода отработал правильно, объем памяти, выделенный для строки-
приемника (dststr), должен быть по крайней мере не меньше размера
стро ки - источ н и ка.
Листинг 2.29. Фрагмент кода, использующий команду movsb
для копирования одной строки в другую
srcStr DB "This text is copied to dstStr", 0
lenStr EQU $-srcStr
dstStr DB 64 DUP (' ')
eld
mov ECX, lenStr
lea ESI, srcStr
lea EDI, dstStr
rep movsb
Префикс rep использует в качестве параметра содержимое регистра ЕСХ.
В остальном же программа работает аналогично предыдущему примеру.
Операции копирования можно выполнять также и для массивов целых или
вещественных чисел. В следующем фрагменте кода (листинг 2.30) содержимое
целочисленного массива SARRAY копируется в массив DARRAY.
Листинг 2.30. Фрагмент кода, выполняющий копирование одного целочисленного
массива в другой
SARRAY DD 245, 11, -34, 56, 7, 19
LEN_SARRAY DD ($-SARRAY)/4
DARRAY DD 16 DUP (0)
eld
mov ECX, DWORD PTR LEN_STR
lea ESI, SARRAY
lea EDI, DARRAY
rep movsd
В этом фрагменте для копирования целых чисел используется команда
movsd. Размер исходного массива задан переменной LENSARRAY. Выражение
$-SARRAY определяет размер массива sARRAY В байтах, поэтому необходимо
добавить деление на 4, чтобы получить размер в двойных словах.
Команда movs может использоваться для еще одной весьма полезной операции
над двумя строками. Эта операция называется конкатенацией. При ее
выполнении в конец строки-приемника помещаются элементы строки-
источника. Откорректируем исходный текст предыдущего примера так, чтобы
наше приложение выводило на экран содержимое строки-приемника
после конкатенации (листинг 2.31).
Листинг 2.31. Конкатенация двух строк и вывод на экран
содержимого строки-приемника
Src DB "SOURCE STRING", О
LenSrc DD $-Src
Dst DB "DEST STRING + ", 16 DUP (?)
LenDst DD $-Dst-16
eld
mov ECX, DWORD PTR LenSrc
lea ESI, Src
lea EDI, Dst
add EDI, LenDst
rep movsb
; вывод содержимого строки Dst на экран
push EBX
mov EBX, offset Dst
mov ECX, LenDst
add ECX, 16
call write_con
pop EBX
В этом фрагменте мы помещаем содержимое строки src в конец строки
Dst. Для этого необходимо зарезервировать необходимый объем памяти в
строке Dst:
Dst DB "DEST STRING + ", 16 DUP (?)
Кроме того, зададим начальное смещение в строке-приемнике на количество
байт, занимаемое первыми символами:
lea - EDI, Dst
add EDI, LenDst
Как обычно, поместим в регистр ЕСХ число, равное количеству копируемых
байт из строки-источника, и сбросим флаг направления в 0, чтобы индексы
копирования увеличивались на каждой итерации. После выполнения этого
фрагмента программы в Dst будет находиться строка:
"DEST STRING + SOURCE STRING"
Листинг 2.32. Фрагмент кода, выполняющий конкатенацию
двух массивов целых чисел
SARRAY DD 498, -27, 31, -99, -36, 728, -20
LenS EQU ($-SARRAY)/4
DARRAY DD 11, 12, 13, О, О, О, О, О, О, О
LenD EQU ($-DARRAY)/4-7
eld
mov ECX, DWORD PTR LenS
lea ESI, SARRAY
lea EDI, DARRAY
add EDI, LenD*4
rep movsd
<< Назад В начало Далее >> |
|