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





Мы рассмотрели далеко не полный набор математических функций ассемблера. Главная цель — убедить читателя в полной мере использовать математический сопроцессор в программах на ассемблере. При желании можно модифицировать существующие или написать свои собственные математические алгоритмы, которых нет в языках высокого уровня.

Обработка строк и массивов данных
Преимущества ассемблера особенно сильно проявляются при обработке строк и массивов данных. Для выполнения таких операций была разработана целая группа команд, в терминологии Intel именуемая командами строковых примитивов. Под обработкой строк мы будем понимать выполнение следующих операций:
• сравнение двух строк;
• копирование строки-отправителя в строку-получатель;
• считывание строк из устройства или файла;
• запись строки в устройство или файл;
• определение размера строки;
• нахождение подстроки в заданной строке;
• объединение двух строк (конкатенация).

Операции над строками широко используются в языках высокого уровня. Ассемблерная реализация таких операций позволяет существенно повысить быстродействие программ на языках высокого уровня, особенно если требуется обработать большое число строк и массивов. Рассмотрим вначале основные команды языка ассемблера для обработки строк.
Программа представляет каждую строку массивом символов в памяти и может выполнять строковые операции над байтами, словами и двойными словами. Строковые команды не применяют способы адресации, используемые другими командами. Они используют регистры E S I И EDI. В эти регистры помещается адрес первого элемента, с которого начинается обработка строки.
Все строковые команды корректируют адрес после выполнения операции. Строка может состоять из нескольких символов, но в каждый момент времени команды обработки строк могут работать только с одним символом.

Автоматический инкремент (увеличение) или декремент (уменьшение) адреса операнда позволяет быстро обрабатывать строковые данные. Флаг направления (Direct Flag) в регистре состояния определяет направление обработки строк. Если он равен 1, то адрес уменьшается, а если он сброшен в 0, то адрес увеличивается. Сама величина инкремента или декремента адреса определяется размером операнда. Например, для символьных строк, в которых размер операндов равен 1 байту, команды обработки строк изменяют адрес на 1 после каждой операции. Если обрабатывается массив целых чисел, в котором каждый операнд занимает 4 байта, то строковые команды изменяют адрес на 4. После выполнения команды указатель адреса в регистре EST. или EDI ссылается на следующий элемент строки.
Рассмотрим представление строк в разных языках программирования. Наиболее часто используются строки с завершающим нулем (null-terminated strings). Они используются в языке С и в операционных системах Windows. Вот как определяется такая строка на языке ассемблера:
String_0 DB "NULL-TERMINATED STRING", О

В языке Pascal (соответственно, в Delphi) в начале строки указывается ее размер. Элементы, расположенные за последним символом строки, считаются неопределенными. На языке ассемблера запись такой строки могла бы выглядеть так:
String_PAS DB ODh, "STRING PASCAL"

Мы будет рассматривать в основном строки с завершающим нулем. Можно выделить пять основных команд для работы со строками. К этим командам относятся:
• movs — команда для перемещения строки данных из одного участка памяти в другой;
• lods — команда загрузки строки, адрес которой указан в регистре EST., в регистр-аккумулятор ЕАХ (АХ, AL);
• stos — команда сохранения содержимого регистра ЕАХ (АХ, AL) В памяти по адресу, указанному в регистре E D I ;
• . cmps — команда сравнения строк, расположенных по адресам, содержащимся в регистрах EST. И E D I ;
• seas — команда сканирования строк. Сравнивает содержимое регистра

ЕАХ (АХ, AL) с содержимым памяти, определяемым регистром E D I .


 
 
 

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