ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 18.06.2021

Просмотров: 132

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Пересылка цепочек

Команды, реализующие операцию-примитив пересылки цепочек, производят копирование элементов из одной области памяти (цепочки) в другую. Размер элемента определяется применяемой командой. Ассемблер предоставляет в распоряжение программиста четыре команды, работающие с разными размерами элементов цепочки:

MOVS адрес_приемника,адрес_источника — переслать цепочку (MOVe String);

MOVSB — переслать цепочку байтов (MOVe String Byte);

MOVSW — переслать цепочку слов (MOVe String Word);

MOVSD — переслать цепочку двойных слов (MOVe String Double word).

Синтаксис команды MOVS:

movs адрес_приемника,адрес_источника

Команда копирует байт, слово или двойное слово из цепочки, адресуемой операндом адрес_источника, в цепочку, адресуемую операндом адрес_приемника. Размер пересылаемых элементов ассемблер определяет, исходя из атрибутов идентификаторов, указывающих на области памяти приемника и источника. К примеру, если эти идентификаторы были определены директивой DB, то пересылаться будут байты, если идентификаторы были определены с помощью директивы DD, то пересылке подлежат 32-разрядные элементы, то есть двойные слова. При этом для цепочечных команд с операндами, к которым относится и команда пересылки movs адрес_приемника,адрес_источника, не существует машинного аналога. При трансляции в зависимости от типа операндов транслятор преобразует ее в одну из трех машинных команд: MOVSB, MOVSW или MOVSD.

Сама по себе команда MOVS пересылает только один элемент, исходя из его типа, и модифицирует значения регистров ESI/SI и EDI/DI. Если перед командой написать префикс REP, то одной командой можно переслать до 64 Кбайт данных (если размер адреса в сегменте 16 бит — use16) или до 4 Гбайт данных (если размер адреса в сегменте 32 бита — use32). Число пересылаемых элементов должно быть загружено в счетчик — регистр СХ (use16) или ЕСХ (use32). Последовательность действий, которые нужно выполнить в программе для того, чтобы переслать цепочку элементов из одной области памяти в другую с помощью команды MOVS включает в себя (в общем случае эту последовательность можно рассматривать как типовую для выполнения любой цепочечной команды).

Сравнение цепочек

Команды, реализующие операцию-примитив сравнения цепочек, производят сравнение элементов цепочки-источника с элементами цепочки-приемника.

TASM предоставляет программисту четыре команды сравнения цепочек, работающие с разными размерами элементов цепочки:

CMPS адрес_приемника,адрес_источника — сравнить строки (СоМРаге String);

CMPSB — сравнить строку байтов (СоМРаге String Byte);

CMPSW — сравнить строку слов (СоМРаге String Word);

CM PSD — сравнить строку двойных слов (СоМРаге String Double word).

Команда CMPS

Синтаксис команды CMPS:

cmps адрес_приемника,адрес_источника

Здесь:

адрес_источника определяет адрес цепочки-источника в сегменте данных, заранее загружаемый в пару регистров DS:ESI/SI;


адрес_приемника определяет адрес цепочки-приемника, которая должна находиться в дополнительном сегменте, заранее загружаемый в пару регистров ES:EDI/DI. F P B

Алгоритм работы команды CMPS заключается в последовательном выполнении вычитания (элемент цепочки-источника минус элемент цепочки-получателя) над очередными элементами обеих цепочек. Принцип выполнения вычитания командой CMPS такой же, как у команды сравнения СМР. Она так же, как и СМР, производит вычитание элементов, не записывая при этом результата, и устанавливает флаги ZF, SF и OF. После вычитания очередных элементов цепочек командой CMPS индексные регистры ESI/SI и EDI/DI автоматически изменяются в соответствии со значением флага DF на значение, равное размеру элемента сравниваемых цепочек. Чтобы заставить команду CMPS выполняться несколько раз, то есть произвести последовательное сравнение элементов цепочек, необходимо перед командой CMPS определить префикс повторения. С командой CMPS можно использовать префиксы повторения REP, REPE/REPZ или REPNE/REPNZ:

REP — сравнивать элементы цепочек, пока ЕСХ/СХ>0;

REPE или REPZ - сравнивать элементы цепочек до выполнения одного из двух условий:

содержимое ЕСХ/СХ равно нулю;

в цепочках встретились разные элементы (флаг ZF стал равен нулю);

REPNЕ или REPNZ – сравнивать элементы цепочек до выполнения одного из двух условий:

содержимое ЕСХ/СХ равно нулю;

в цепочках встретились одинаковые элементы (флаг ZF стал равен единице).

Таким образом, выбор подходящего префикса позволяет организовать более гибкий поиск одинаковых или различающихся элементов цепочек командой CMPS. Критерий для выбора префикса – условие выхода из цикла. Для определения конкретного условия наиболее подходящим является способ, использующий команду условного перехода JCXZ. Ее работа заключается в анализе содержимого регистра ЕСХ/СХ, и если оно равно нулю, то управление передается на метку, указанную в качестве операнда JCXZ. Так как в регистре ЕСХ/СХ содержится счетчик повторений для цепочечной команды, имеющей любой из префиксов повторения, то, анализируя ЕСХ/СХ, можно определить условия выхода из цикла цепочечной команды. Если значение в ЕСХ/СХ не равно нулю, то это означает, что выход произошел по причине совпадения либо несовпадения очередных элементов цепочек. Существует возможность еще больше конкретизировать информацию об условии завершения операции сравнения. Сделать это можно с помощью команд условной передачи управления (табл. 1).

Таблица 1. Соответствие команд условной передачи управления условиям завершения команды CMPS


Условие завершения сравнения

Соответствующая команда условного перехода

операнд_источник > операнд_приемник

JA или JG (операнд со знаком)

операнд источник = операнд приемник

JE (в том числе для операнда со знаком)

операнд источник <>операнд приемник

JNE или JNZ (в том числе для операнда со знаком)

операнд_источник < операнд_приемник

JB или JL (операнд со знаком)

операнд_источник <= операнд_приемник

JBE или JLE (операнд со знаком)

операнд_источник >= операнд_приемник

JAE или JGE (операнд со знаком)



В связи с тем, что после каждой итерации цепочечная команда автоматически осуществляет инкремент-декремент значения адреса в соответствующих индексных регистрах, поэтому после выхода из цикла в этих регистрах будут находиться адреса элементов, находящихся в цепочке после элементов, послуживших причиной выхода из цикла. Для получения истинного адреса этих элементов необходимо скорректировать содержимое индексных регистров, увеличив либо уменьшив значение в них на длину элемента цепочки.