Команды обработки строк
Цепочка – это последовательность элементов, размер которых может быть байт, слово, двойное слово. Содержимое этих элементов может быть любое – символы, числа. В системе команд микропроцессора имеется семь операций-примитивов обработки цепочек. Каждая из них реализуется в микропроцессоре тремя командами, в свою очередь, каждая из этих команд работает с соответствующим размером элемента — байтом, словом или двойным словом. Типовой набор действий для выполнения любой цепочечной команды: à Установить значение флага df в зависимости от того, в каком направлении будут обрабатываться элементы цепочки — в направлении возрастания или убывания адресов. à Загрузить указатели на адреса цепочек в памяти в пары регистров ds:(e)si и es: (e)di. à Загрузить в регистр ecx/cx количество элементов, подлежащих обработке. à Выдать цепочечную команду с префиксом повторений. Пересылка цепочек movs адрес_прием, адрес_источника (MOVe String)- переслать цепочку; movsb MOVe String Byte) — переслать цепочку байт; movsw (MOVe String Word) — переслать цепочку слов; movsd (MOVe String Double word) — переслать цепочку двойных слов. Команда копирует байт, слово или двойное слово из цепочки источника, в цепочку приемника. Размер пересылаемых элементов ассемблер определяет, исходя из атрибутов идентификаторов. К примеру, если эти идентификаторы были определены директивой db, то пересылаться будут байты, если идентификаторы были определены с помощью директивы dd, то пересылке подлежат двойные слова. Для цепочечных команд с операндами типа movs адрес_приемника,адрес_источника, не существует машинного аналога. При трансляции в зависимости от типа операндов транслятор преобразует ее в одну из трех машинных команд: movsb, movsw или movsd. Сама по себе команда movs пересылает только один элемент, исходя из его типа, и модифицирует значения регистров esi/si и edi/di. Если перед командой написать префикс rep, то одной командой можно переслать до 64 Кбайт данных. Число пересылаемых элементов должно быть загружено в счетчик — регистр cx (use16) или ecx (use32). Пример 13. Пересылка строк командой movs MODEL small .STACK 256 .datasource db 'Тестируемая строка','$' ;строка-источник dest db 19 DUP (' ') ;строка-приёмник .code main: mov ax,@data ;загрузка сегментных регистров mov ds,ax ;настройка регистров DS и ES на адрес сегмента данных mov es,ax cld ;сброс флага DF — обработка строки от начала к концу lea si,source ;загрузка в si смещения строки-источника lea di,dest ;загрузка в DS смещения строки-приёмника mov cx,20 ;для префикса rep — счетчик повторений (длина строки) rep movs dest,source ;пересылка строки lea dx,dest mov ah,09h ;вывод на экран строки-приёмника int 21h mov ax,4c00h int 21h end mainОперация сравнения цепочек cmps адрес_приемника,адрес_источника(CoMPare String) — сравнить строки; cmpsb (CoMPare String Byte) — сравнить строку байт; cmpsw (CoMPare String Word) — сравнить строку слов; cmpsd (CoMPare String Double word) — сравнить строку двойных слов. Алгоритм работы команды cmps заключается в последовательном выполнении вычитания (элемент цепочки-источника — элемент цепочки-получателя) над очередными элементами обеих цепочек. Принцип выполнения вычитания командой cmps аналогичен команде сравнения cmp. Она, так же, как и cmp, производит вычитание элементов, не записывая при этом результата, и устанавливает флаги zf, sf и of. После выполнения вычитания очередных элементов цепочек командой cmps, индексные регистры esi/si и edi/di автоматически изменяются в соответствии со значением флага df на значение, равное размеру элемента сравниваемых цепочек.
Операция сканирования цепочек scas адрес_приемника (SCAning String) — сканировать цепочку; scasb (SCAning String Byte) — сканировать цепочку байт; scasw (SCAning String Word) — сканировать цепочку слов; scasd (SCAning String Double Word) — сканировать цепочку двойных слов Эти команды осуществляют поиск искомого значения, которое находится в регистре al/ax/eax. Принцип поиска тот же, что и в команде сравнения cmps, то есть последовательное выполнение вычитания (содержимое регистра_аккумулятора – содержимое очередного_элемента_цепочки). В зависимости от результатов вычитания производится установка флагов, при этом сами операнды не изменяются. Загрузка элемента цепочки в аккумулятор lods адрес_источника (LOaD String) — загрузить элемент из цепочки в регистр-аккумулятор al/ax/eax; lodsw (LOaD String Word) — загрузить слово из цепочки в регистр ax; lodsd (LOaD String Double Word) — загрузить двойное слово из цепочки в регистр eax. Эта операция-примитив позволяет извлечь элемент цепочки и поместить его в регистр-аккумулятор al, ax или eax. Эту операцию удобно использовать вместе с поиском (сканированием) с тем, чтобы, найдя нужный элемент, извлечь его (например, для изменения).
Популярное: Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (181)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |