бегущий строка
ExCode.ru :: Статьи - Обработка строк
5й выпуск журнала "eXcode e-zine" скачали 3945 раз
Новости
Опросы
Магазин
Гостевая
Файлы
Поиск:
Форум
» Статьи
eXcode.ru » Статьи » Assembler
Наши проекты «
» С / С++ (1258)» Delphi/Pascal (5049)» Assembler (29)» VB / VBA (29)» JAVA / JavaScript (225)» PHP (319)» Ruby (59)» Perl (13)» ASP / ASP.NET (79)» WinAPI (19)» Базы данных (37)» .NET (121)» Web (124)» Алгоритмы (29)» Задачи (30)» Спецификации (4)» Обзор книг (9)» Другие (360)» Архитектура ЭВМ (64)» Защита информации (56)» ОС (93)
»
»
»
»
»
» Cейчас на сайте
Пользователей: 0Гостей: 11
» Рассылка сайта
» Наши друзья
Обработка строк<<Назад
Для работы со строками, или цепочками символов или чисел (т.е. попросту говоря,
с массивами произвольных данных) в МП предусмотрен ряд специальных команд:
movs - пересылка строки;
cmps - сравнение двух строк;
seas - поиск в строке заданного элемента;
lods - загрузка аккумулятора (регистров AL или АХ) из строки;
stos - запись элемента строки из аккумулятора (регистров АХ или
AL).
Эти команды очень удобны,
однако их использование сопряжено с некоторыми трудностями, так как процессор,
выполняя эти команды, неявным образом использует ряд своих регистров. Только
если все эти регистры настроены должным образом, команды будут выполняться правильно.
В результате включение в программу предложения с командой, например,
movs, требует
иной раз 6-7 дополнительных предложений, в которых осуществляется подготовка
условий для правильного выполнения этой команды.
Хотя команды обработки строк, как правило, включаются в программу без явного
указания операндов, однако каждая команда, в действительности, использует два
операнда. Для команд seas бегущий строка stos операндом-источником служит аккумулятор, бегущий строка
операнд-приемник находится в памяти. Для команды
lods, наоборот, операнд-источник
находится в памяти, бегущий строка приемником служит аккумулятор. Наконец, для команд movs
и cmps оба операнда, бегущий строка источник, бегущий строка приемник, находятся в памяти.
Все рассматриваемые команды, выполняя различные действия, подчиняются одинаковым
правилам, перечисленным ниже. Операнды, находящиеся в памяти, всегда адресуются
единообразно: операнд-источник через регистры
DS:SI, бегущий строка операнд-приемник через
регистры ES:DI. При однократном выполнении команды обрабатывают только один
элемент, бегущий строка для обработки строки команды должны предваряться одним из префиксов
повторения. В процессе обработки строки регистры SI бегущий строка DI автоматически смещаются
по строке вперед (если флаг DF = 0) или назад (если флаг DF = 1), обеспечивая
адресацию последующих элементов. Каждая команда имеет модификации для работы
с байтами или словами (например, movsb бегущий строка movsw).
Таким образом, для правильного выполнения команд обработки строк необходимо
(в общем случае) предварительно настроить регистры DS:SI и
ES:DI, установить
или сбросить флаг DF, занести в СХ длину обрабатываемой строки, бегущий строка для команд
seas бегущий строка stos еще поместить операнд-источник в регистр АХ (или AL при работе с
байтами).
Однако сама операция, после всей этой настройки, осуществляется одной командой,
которая обычно даже не содержит операндов, хотя может иметь префикс повторения.
Стоит подчеркнуть, что строки, обрабатываемые рассматриваемыми командами, могут
находиться в любом месте памяти: в полях данных программы, в системных областях
данных, в ПЗУ, в видеобуфере. Например, с помощью команды movs можно скопировать
массив данных из одной массивной переменной в другую, бегущий строка можно переслать страницу
текста на экран терминала. Рассмотрим несколько примеров использования команд
обработки строк, ограничившись лишь теми фрагментами программ, которые имеют
отношение к рассматриваемому вопросу.
Пример 3-6. Чтение из ПЗУ BIOS
даты его выпуска
;В
программном сегменте
main
proc
mov
AX,0F000h ;Занесем в DS
mov
DS,AX ;Сегментный
адрес ПЗУ BIOS
mov
SI,0FFF5h ;Смещение к
интересующему нас полю
mov
AX,data ;Настроим
RS
mov
RS,AX ;на
сегмент данных программы
mov
DI,offset bios ;Смещение к полю для хранения даты
mov
CX,8
;Перенести 8 байт
cld
;Движение по строке вперед
rep
movsb
;Перенос байтов
;Выведем
полученную информацию на экран
mov
AX,data ; Теперь
настроим DS
mov
DS,AX ;на
сегмент данных программы
mov
AH,40h ;Функция
вывода
mov
BX,1
;Дескриптор экрана
mov
CX,8
;Вывести 0 байт
mov
DX,offset bios ;Смещение в строке
int
21h
; Вызов DOS
;В
сегменте данных
bios
db 8 dup (′) ;Поле для хранения
даты
Известно, что в ПЗУ
BIOS,
сегментный адрес которого составляет F000h (см. рис. 1.5), наряду с программами
управления аппаратурой компьютера, хранятся еще бегущий строка некоторые идентификаторы.
Так, в восьми байтах ПЗУ, начиная с адреса F000h:FFFSh, записана в кодах ASCII
дата разработки ПЗУ. В примере 3.6 выполняется чтение этой даты, сохранение
ее в памяти бегущий строка вывод на экран для контроля. Поскольку интересующая нас дата хранится
в ПЗУ BIOS в кодах ASCII, никаких преобразований содержимого этого участка ПЗУ
перед выводом на экран не требуется.
В программе осуществляется настройка всех необходимых для выполнения команды
movs регистров (DS:SI, ES:DI, CX бегущий строка флага DF) бегущий строка одной командой movsb с префиксом
rep содержимое требуемого участка ПЗУ переносится в поле
bios. Перенос строки
байтами подчеркивает ее формат (в строке записаны байтовые коды
ASCII), однако
в нашем примере, при четном числе переносимых байтов, более эффективно осуществить
перенос по словам. В этом варианте команда movs будет фактически повторяться
не 8 раз, бегущий строка только 4. Для этого достаточно занести в СХ число 4 (вместо 8) бегущий строка
использовать вариант команды niovsw.
Для выполнения команды movs нам пришлось настроить сегментный регистр DS на
сегмент BIOS. Если в дальнейшем предполагается обращение к полям данных программы,
как это имеет место в примере 3-6, в регистр DS следует занести сегментный адрес
сегмента данных. После этого, настроив остальные регистры для вызова функции
40h, прочитанную из BIOS строку можно вывести на экран.
В рассмотренном примере неявно предполагалось, что программа будет в дальнейшем
как-то использовать полученную из BIOS информацию. Если задача программы заключается
просто в выводе на экран даты выпуска BIOS, то нет необходимости сначала копировать
эту дату из BIOS в поля данных программы, бегущий строка потом выводить ее на экран. Можно
было поступить гораздо проще: настроив регистр DS на сегмент
BIOS, бегущий строка регистр
DX на адрес строки с датой, вызвать функцию 40h бегущий строка вывести на экран текст непосредственно
из сегмента BIOS. Тогда содержательная часть программы сократится в два раза
и примет такой вид:
mov
AX,0F00h ;Настроим DS
mov DS,AX
;на сегмент BIOS
mov
AH,40h ;Функция
вывода
mov
BX,1
;Дескриптор экрана
mov
CX,8
;Вывести 8 байт
mov
DX,0FFFSh ;Смещение к дате
int
21h
;Вызов DOS
Приведенный фрагмент не
имеет отношения к данному разделу, так как в нем уже нет команд обработки строк.
В то же время он подчеркивает важность сегментных регистров бегущий строка гибкость сегментной
адресации. Функция 40h ожидает найти адрес выводимой на экран строки в регистрах
DS:DX, бегущий строка никакие другие регистры в этом случае использовать нельзя. С другой
стороны, эти регистры можно настроить на любой участок памяти бегущий строка вывести на экран
(а также бегущий строка на принтер, в файл или в последовательный порт) данные откуда угодно.
Рассмотрим теперь пример работы с командами lods и
stos, которые можно использовать
как по отдельности, так бегущий строка в паре друг с другом. Эти команды очень удобны, в
частности, для прямого обращения к видеопамяти.
К экрану, как бегущий строка к любому другому устройству, входящему в состав компьютера,
можно обращаться тремя способами: с помощью функций DOS (прерывание 21h), с
использованием прерывания BIOS (для управления экраном используется прерывание
10h) и, наконец, путем прямого программирования аппаратуры, в данном случае
видеобуфера (видеопамяти). Функции DOS позволяют выводить только черно-белый
текст бегущий строка имеют ряд других ограничений (нельзя очистить экран, нет средств позиционирования
курсора); при использовании прерывания BIOS все эти ограничения снимаются, однако
программирование с помощью средств BIOS весьма трудоемко; наконец, прямая запись
в видеопамять, предоставляя возможность вывода цветного текста в любую точку
экрана, является процедурой очень простой и, к тому же, повышает скорость вывода
(по сравнением с использованием системных средств) в десятки бегущий строка сотни раз. Прямое
обращение к видеобуферу удобно использовать, например, в обработчиках прерываний,
где запрещен вызов функций DOS бегущий строка имеются ограничения на обращение к средствам
BIOS.
Пусть по ходу программы необходимо вывести в нижнюю строку экрана предупреждающее
сообщение. Для этого в программу надо включить следующие предложения:
Пример 3-7. Вывод на экран
прямой записью в видеопамять
;В
полях данных, адресуемых через DS
msg
db ′Измерения закончены′
msg_len=$-msg
;Длина строки
;В программном сегменте
mov
SI,offset msg
;DS:31->выводимая строка
mov
AX,OB800h
;Сегментный адрес видеобуфера
mov
ES,AX
;Будем адресовать через ES
mov
DI,25*80*2
;Смещение к последней строке экрана
mov
CX,msg_len
;Счетчик цикла вывода символов
eld
;DF=0 , движение по строке
; бегущий строка по экрану вперед
mov
AH,31h
;Атрибут символов-синий по
; голубому
outher:
lodsb
;Взять символ из строки в AL
show
; Вывод на экран символа
; из AL бегущий строка его атрибута из AH
loop
outser
; Цикл
Регистры DS:SI настраиваются
на адрес начата выводимой строки; регистры ES:DI - на адрес требуемой позиции
в видеобуфере. В регистр СХ надо поместить длину строки в байтах, бегущий строка флаг DF
сбросить, чтобы двигаться по строке вперед. На экран будет выводиться содержимое
регистра АХ, в младшем байте которого должен находиться код ASCII выводимого
символа, бегущий строка в старшем байте - атрибут символа, т.е. код цвета символа (в младшем
полубайте) бегущий строка код цвета фона (в старшем полубайте). В примере число 31h образует
синие символы по бирюзовому фону. При желании можно выбрать другую комбинацию
цветов, выбрав ее с помощью табл. 3.1.
Таблица 3.1. Коды цветов стандартной цветовой палитры
Код
Цвет
Код
Цвет
0h
Черный
8h
Серый
1h
Синий
9h
Голубой
2h
Зеленый
10h
Салатовый
3h
Бирюзовый
11h
Светло-бирюзовый
4h
Красный
12h
Розовый
5h
Фиолетовый
13h
Светло-фиолетовый
6h
Коричневый
14h
Желтый
7h
Белый
15h
Ярко-белый
Выбирая цвета, следует
иметь в виду, что при стандартной настройке видеосистемы для цвета фона можно
использовать лишь значения из левого столбца таблицы; выбор любого яркого цвета
из правого столбца приведет в выводу мерцающего символа. Например, атрибут символа
Bill образует синий мерцающий символ на бирюзовом фоне (а не синий символ на
светло-бирюзовом фоне).
Содержательную часть цикла вывода образуют две команды lodsb и
stosw. Первая
команда загружает в регистр AL код очередного символа, вторая выводит его вместе
с атрибутом, хранящемся в АН, на экран. При этом после каждого выполнения команды
lodsb содержимое SI увеличивается процессором на 1, смещая адресацию к следующему
символу строки; в то же время каждое выполнение команды stosw увеличивает DI
на 2 (потому что команда stosw работает со словами), смещая адресацию на экране
на 2 байт, т.е. как раз к позиции следующего символа.
К началу статьи
Обсудить статью на ФорумеДобавил: MadvEXДата публикации: 2005-07-03 20:10:25Рейтинг статьи:3.00 [Голосов 6]Кол-во просмотров: 5618
download.excode.ru
xskernel.excode.ru
e-zine.excode.ru
blog.excode.ru
read.excode.ru
c404.ru
Ваше меню «
Имя:
Пароль:
РегистрацияВсе изменения на сайте
Голосование «
Какую P2P-сеть предпочитаете?
Kazaa6% (7)Shareaza2% (3)Ml'Donkey9% (11)BitTorrent21% (26)Другой8% (10)А что такое P2P?21% (26)Ничем не пользуюсь28% (35)Ненавижу P2P!!!6% (7)
Проголосовало: 125
Комментариев: 5
Кодерский Анекдот «
Приходит программист в библиотеку бегущий строка спрашивает библиотекаря:
- Книги по программированию где?
Ему объясняют, что заканчивать предложение на вопросительном слове стилистически неправильно.
Программист:
- Понял! Книги по программированию где, дурья твоя башка?
10
9
8
7
6
5
4
3
2
1
Рейтинг: 4/10 (1)
Посмотреть все анекдоты
Обсуждаемые темы «
» How register mai …
» Заработок в сети …
» проблема с внешн …
» Порно Видео для …
» армянка марьям п …
» melodie peters b …
» подростковое пор …
» Homemade Porn Clip
» ПоРНуХаа
eXcode.ru » Статьи » Assembler
Лучшие статьи || SiteMap || Design by DigitalDragon [2D] || Copyright © ExCode.ru 2005-2008 || Контакты ||
разделы
организация видеоконференция
ожирение
купить стиральный
консультирование организация
snr
растворитель
фотопечать
фейрверк праздник
автобетононасосы
срезанный цвет
государственный герб
ppg краска
управление иваново
обрезание
бордюр
купить fifa 2006
restart плита
детский мир
педагогика психология
залог кострома
выписка егрп
маршрутизатор
газонокосилка black decker
флажок настольный
ariston опт
бегущий строка