<<
>>

Глава 12 Цепочечные команды

Р- Средства процессора для обработки цепочек элементов в памяти ► Операции пересылки и сравнения цепочек р Операции для работы с отдельными элементами цепочек Р- Операции для работы с портами ввода-вывода В данной главе будет рассмотрена чрезвычайно интересная группа команд, пони- мание принципов работы которых и их грамотное использование способны значи- тельно облегчить жизнь программисту, пишущему программы на языке ассембле- ра.
Речь идет о так называемых цепочечных командах, которые иногда называют командами обработки строк символов. Однако эти названия не идентичны. Под строкой символов здесь понимается последовательность байтов, а цепочка — это более общее название для случаев, когда размер элемента последовательности пре- вышает байт и составляет слово или двойное слово. Таким образом, цепочечные команды позволяют проводить действия над блоками памяти, представляющими собой последовательности элементов следующего размера: В 8 битов, то есть байт; ⅞ 16 битов, то есть слово; i' 32 бита, то есть двойное слово.
Содержимое этих блоков для процессора не имеет никакого значения. Это мо- гут быть символы, числа и все что угодно. Главное, чтобы размеры элементов соот- ветствовали одному из перечисленных ранее вариантов и эти элементы находи- лись в соседних ячейках памяти. Всего в системе команд процессора поддерживаются семь операций-примити- вов обработки цепочек. Каждая из них реализуется в процессоре тремя командами, в свою очередь, каждая из этих команд работает с соответствующим размером эле- мента — байтом, словом или двойным словом. Особенность всех цепочечных ко- манд в том, что они, кроме обработки текущего элемента цепочки, корректируют содержимое определенных регистров с тем, чтобы автоматически продвинуться к следующему элементу цепочки. Перечислим операции-примитивы обработки цепочек и реализующие их ко- манды ассемблера.
* Пересылка цепочки: D MOVS адрес_приемника,адрес_источника; ? МОVSВ; D МОVSW; D МОVSD. ж Сравнение цепочек: П СМРS адрес_приемника,адрес_источника; ? СМРSВ; D СМРSW; а CMPSD. ж Сканирование цепочки: D SCAS адрес_приемника; D SCASB; D SCASW; D SCASD. ж Загрузка элемента из цепочки: П LODS адрес_источника; ? LОDSВ; П LODSW; П LОDSD. ш Сохранение элемента в цепочке: П STOS адрес_приемника; ■ П STOS В ; П SТОSW; П SТОSD. * Получение элементов цепочки из порта ввода-вывода: П INS адрес_приемника,номер_порта; П INSB; П INSW; П INSD. М Вывод элементов цепочки в порт ввода-вывода: П OUTS номер_порта,адрес_источника; ? OUTBS; ? OUTWS; ? OUTDS. Логически к этим командам нужно отнести и так называемые префиксы повто- рения. Вспомните формат машинной команды и его первые необязательные байты префиксов. Один из возможных типов префиксов — это префиксы повторения. Они предназначены для использования цепочечными командами. Префиксы по- вторения имеют свои мнемонические обозначения: ^ RЕР; г- REPE, или REPZ; ⅞ REPNE, или REPNZ. Эти префиксы повторения указываются перед нужной цепочечной командой в поле метки. Цепочечная команда без префикса выполняется один раз. Размеще- ние префикса перед цепочечной командой заставляет ее выполняться в цикле. Раз- личия приведенных префиксов — в основании, по которому принимается решение о циклическом выполнении цепочечной команды: по состоянию регистра ЕСХ/СХ или по флагу нуля ZF. ^ Префикс повторения REP (REPeat) используется с командами, реализующими операции-примитивы пересылки и сохранения элементов цепочек, — соответ- ственно, MOVS и SТОS. Префикс REP заставляет данные команды выполняться, пока содержимое в ЕСХ/СХ не станет равным 0. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое ЕСХ/СХ на единицу. Та же команда, но без префикса, этого не делает. К Префиксы повторения REPE (REPeat while Equal) и REPZ (REPeat while Zero) являются абсолютными синонимами. Они заставляют цепочечную команду выполняться до тех пор, пока содержимое ЕСХ/сх не равно 0 или флаг ZF равен 1.
Как только одно из этих условий нарушается, управление передается следую- щей команде программы. Благодаря возможности анализа флага ZF наиболее эффективно эти префиксы можно использовать с командами СМРS и SCAS для поиска различающихся элементов цепочек. ш Префиксы повторения REPNE (REPeat while Not Equal) и REPNZ (REPeat while Not Zero) также являются абсолютными синонимами. Их действие на цепочеч- ную команду несколько отличается от действий префиксов REPE/REPZ. Префик- сы REPNE/REPNZ заставляют цепочечную команду циклически выполняться до тех пор, пока содержимое ЕСХ/СХ не равно нулю или флаг ZF равен нулю. При нарушении одного из этих условий работа команды прекращается. Данные пре- фиксы также можно использовать с командами СМРS и SCAS, но для поиска со- впадающих элементов цепочек. Следующий важный момент, связанный с цепочечными командами, заключа- ется в особенностях формирования физического адреса операндов адрес_источни- ка и адрес_приемника. Цепочка-источник, адресуемая операндом адрес_источника, может находиться в текущем сегменте данных, определяемом регистром DS. Це- почка-приемник, адресуемая операндом адрес_приемника, должна быть в дополни- тельном сегменте данных, адресуемом сегментным регистром ES. Важно отметить, что допускается замена (с помощью префикса замены сегмента) только регистра DS, регистр ES подменять нельзя. Вторые части адресов (смещения цепочек) также находятся в строго определенных местах. Для цепочки-источника это регистр ESI/SI (Source Index register — индексный регистр источника). Для цепочки-получателя это регистр ЕDI/DI (Destination Index register — индексный регистр приемника). Таким образом, полные физические адреса для операндов цепочечных команд сле- дующие: ⅛ адрес_источника — пара ds:esi/si; s∙ адрес_приемника — параеs:еdi/di. Кстати, вспомните команды LDS и LES, которые мы рассматривали в главе 7. Эти команды позволяют получить полный указатель (сегмент плюс смещение) на ячей- ку памяти. Применение их в данном случае очень удобно в силу жесткой регла- ментации использования регистров для адресации операндов источника и прием- ника в цепочечных командах.
Вы, наверное, обратили внимание на то, что все семь групп команд, реализую- щих цепочечные операции-примитивы, имеют похожий по структуре набор ко- манд. В каждом из этих наборов присутствуют одна команда с явным указанием операндов и три команды, не имеющие операндов. На самом деле набор команд процессора имеет соответствующие машинные команды только для цепочечных команд ассемблера без операндов. Команды с операндами транслятор ассемблера задействует только для определения типов операндов. После того как выяснен тип элементов цепочек по их описанию в памяти, генерируется одна из трех машин- ных команд для каждой из цепочечных операций. По этой причине все регистры, содержащие адреса цепочек, должны быть инициализированы заранее, в том чис- ле и для команд, допускающих явное указание операндов. В силу того, что цепоч- ки адресуются однозначно, нет особого смысла применять команды с операндами. Главное, что вы должны запомнить, — правильная загрузка регистров указателя- ми обязательно требуется до выдачи любой цепочечной команды. Также на прак- тике могут встретиться случаи, когда транслятор потребует явно переопределить сегмент ES: для соответствующего операнда в команде с явным указанием опе- рандов. Последний важный момент, касающийся всех цепочечных команд, — это на- правление обработки цепочки. Есть две возможности: ⅛ от начала цепочки к ее концу, то есть в направлении возрастания адресов; ⅛“ от конца цепочки к началу, то есть в направлении убывания адресов. Как мы увидим позже, цепочечные команды сами выполняют модификацию регистров, адресующих операнды, обеспечивая тем самым автоматическое продви- жение по цепочке. Количество байтов, на которые эта модификация осуществля- ется, определяется кодом команды. А вот знак этой модификации определяется значением флага направления DF (Direction Flag) в регистре EFLAGS/FLAGS: т если DF = 0, то значения индексных регистров ESI/SI и EDI/DI будут автомати- чески увеличиваться (операция инкремента) цепочечными командами, то есть обработка будет осуществляться в направлении возрастания адресов; в если DF = 1, то значения индексных регистров ESI/SI и EDI/DI будут автомати- чески уменьшаться (операция декремента) цепочечными.командами, то есть обработка будет идти в направлении убывания адресов. Состоянием флага DF можно управлять с помощью двух команд, не имеющих операндов: CLD (Clear Direction Flag) — очистить флаг направления (команда сбрасывает флаг направления DF в 0); * STD (Set Direction Flag) — установить флаг направления (команда устанавли- вает флаг направления DF в 1). Это вся информация, касающаяся общих свойств цепочечных команд. Далее мы более подробно рассмотрим каждую операцию-примитив и команды, которые ее реализуют. При этом одну из команд в каждой группе цепочечных команд (ко- манду с операндами) мы будем рассматривать подробнее, поскольку это более об- щая команда в смысле ограничений, накладываемых на типы операндов.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Глава 12 Цепочечные команды:

  1. Определение команды.
  2. § 4.5. Деятельность команд в организации
  3. Признаки команды.
  4. Пример настройки и реабилитации в футбольной команде
  5. Работа с другими командами
  6. Четыре шага по созданию эффективной команды
  7. ШЕСТЬ СТУПЕНЕЙ НА ПУТИ СОЗДАНИЯ КОМАНДЫ.
  8. Кто становится лидером команды
  9. Создание деловой команды «Вероятно, я не лучший советчик в этом вопросе».
  10. Эд САЛЛИВАН. ВРЕМЯ — ДЕНЬГИ Создание команды разработчиков, программного обеспечения, 2001
  11. Глава 8. Глава государства в зарубежных странах
  12. Глава рода
  13. Глава рода
  14. Глава 1
  15. Глава 2
  16. Глава 3
  17. Глава 4