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