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





Каждая команда обработки строк имеет три допустимых формата. Например, команда movs может иметь одно из представлений: movsb, movsw, movsd. Команда movsb может использоваться только для работы с однобайтовыми операндами, movsw — для работы со словами, a movsd — для работы с двойными словами.
Суффиксы ь, w и d определяют шаг инкремента и декремента для индексных регистров E S I И EDI. Если команда используется в общем формате, то размерность операндов должна быть определена явно. Перед выполнением команд строковых примитивов необходимо, чтобы в регистры E S I и/или EDI были загружены адреса обрабатываемых ячеек памяти. Для выполнения повторяющихся операций со строками практически всегда используется префикс повторения rep.
Это позволяет выполнить строковую операцию количество раз, определенное содержимым регистра ЕСХ. Может показаться удобным использовать комбинацию команд lods и stos для перемещения данных из одного места в другое, но для этой цели существует команда пересылки строки movs. Она считывает данные по адресу памяти, находящемуся в регистре E S I , и помещает их по адресу, указываемому регистром E D I . При этом содержимое регистров E S I и EDI изменяется так, чтобы указывать на следующие элементы строк. Команда movs не загружает регистр-аккумулятор во время пересылки.

В команду movs передаются адреса операндов. Только movs и еще одна строковая команда cmps работают с двумя операндами памяти. Все остальные команды требуют, чтобы один или оба операнда находились в одном из регистров микропроцессора. Команда movs, так же как и команды lods и stos, работает как с байтами, так и со словами.

ТИПЫ Операндов, С КОТОРЫМИ работают Команды cmps, movs, seas, lods И stos, должны быть явно определены в программе. Оба операнда должны быть одного типа. Программист также может указать неявно тип операндов с помощью формата команды. Например, команда movsb используется для операций с байтами, а команда movsw.— для операций со словами. Если в программе используется основная форма команды movs, то ассемблер проверяет переменные на правильность сегментной адресации и на совпадение типов.

Команда movs с префиксом rep дает эффективную команду пересылки блока. Имея счетчик символов в регистре ЕСХ И указывающий направление пересылки флаг направления DF, команда rep movs пересылает данные из одного места памяти в другое очень быстро. Следующая программа (листинг 2.28) демонстрирует копирование одной строки в другую. Это уже знакомое нам консольное приложение.

Листинг 2.28. Программа, выполняющая копирование одной строки в другую
.386
.model flat, stdcall
option casemap : none ; различаем регистр символов
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
conTitle DB "Copying of strings example", 0
srcStr DB "This text is copied to dstStr"
lenStr EQU $-srcStr
dstStr DB 64 DUP (' ')
readBuf DB 9
lenReadBuf DD 1
hStdln DD 0
hStdOut DD 0
chrsRead DD • 0
chrsWritten DD 0
STD_INP_HNDL DD --10
STD OUTP HNDL DD --11
. code
start:
call AllocConsole
test EAX, EAX
jz ex
push offset conTitle
call SetConsoieTitieA
test EAX, EAX
jz ex
call getout_hndl
call getinp_hndl
; копирование строки srcStr в dstStr
mov ECX, lenStr
lea ESI, srcStr
lea EDI, dstStr
next:
lodsb
stosb
loop next
; вьшод содержимого строки dstStr в окно консоли
push ЕВХ
mov ЕВХ, offset dstStr
mov ЕСХ, lenStr
call write_con
pop EBX
; ожидание ввода и выход из программы
call read_con
ex:
push О
call ExitProcess
Процедуры
getout_hndl proc
push STD_OUTP_HNDL
call GetStdHandle
mov hStdOut, EAX
ret
getout_hndl endp
getinp_hndl proc
push STD_INP_HNDL
call GetStdHandle
mov hStdln, EAX
ret
getinp_hndl endp
write_con proc
push 0
push chrsWritten
push ECX
push EBX
push hStdOut
call WriteConsoleA
ret
write_con endp
repauds_hc on pr0 oc
push chrsRead
push lenReadBuf
push offset readBuf
push hStdln
call ReadConsoleA
ret
read_con endp
end start


 
 
 

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