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


 
 
 

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