Цепочечные команды
Цепочечные команды предназначены для обработки непрерывных последовательностей байт или слов (так называемых цепочек) как единого целого. Иногда такие команды называют командами обработки строк символов, поскольку любая строка представляет собой непрерывную последовательность байт (первое название более общее). Цепочечные команды реализуют только последовательный доступ к элементам цепочки (от начала к концу или от конца к началу) и обеспечивают автоматическое продвижение от текущего к следующему элементу.
Все цепочечные команды имеют похожий формат, который приведен на рис.11.1.
Рис. 11.1. Формат цепочечных команд
Первые команды предназначены для обработки цепочек байт (String Byte), а вторые – цепочек слов (String Word). Остальная мнемоника команд определяется их назначением.
Префиксы повторения указываются перед нужной цепочечной командой. Цепочечная команда без префикса выполняется один раз. Размещение префикса перед цепочечной командой заставляет ее выполняться в цикле. Существует три префикса повторения:
– REP (от англ. REPeat – повторить) заставляет цепочечную команду циклически выполняться до тех пор, пока содержимое регистра CX не станет равным нулю. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшает содержимое регистра CX на единицу. Та же команда, но без префикса, этого не делает. Этот префикс используется с командами, реализующими операции пересылки и сохранения элементов цепочек;
– REPZ (от англ. REPeat while Zero – повторить пока ноль) заставляет цепочечную команду циклически выполняться до тех пор, пока содержимое регистра CX не станет равным нулю или флаг ZF станет равным единице. Как только одно из этих условий выполняется, управление передается следующей команде программы. Этот префикс используется командами реализующими поиск отличающихся элементов цепочек;
– REPNZ (от англ. REPeat while Not Zero – повторить пока не ноль) заставляет цепочечную команду циклически выполняться до тех пор, пока содержимое регистра CX не станет равным нулю или флаг ZF станет равным нулю. Как только одно из этих условий выполняется, управление передается следующей команде программы. Этот префикс используется командами реализующими поиск совпадающих элементов цепочек.
Цепочечные команды операндов не имеют, поскольку расположение цепочек фиксированное. Физический адрес цепочки-источника определяется парой регистров DS:SI. В сегментном регистре DS указывается сегментная составляющая адреса, а в индексном регистре источника SI – смещение текущего элемента цепочки-источника. Физический адрес цепочки-приемника определяется парой регистров ES:DI. В сегментном регистре ES указывается сегментная составляющая адреса, а в индексном регистре приемника DI – смещение текущего элемента цепочки-приемника. Особо подчеркнем, что в регистрах SI и DI располагаются именно адреса элементов цепочек, а не их индексы или номера внутри строк. Правильная загрузка всех этих регистров обязательно требуется до выполнения любой цепочечной команды.
Цепочечные команды сами выполняют модификацию регистров, адресующих цепочки, обеспечивая тем самым автоматическое продвижение по цепочке. Количество байт, на которые эта модификация осуществляется, определяется кодом команды (либо для байт, либо для слов). Знак этой модификации определяется значением флага направления DF:
– если DF = 0, то значения индексных регистров SI и DI будут автоматически увеличиваться цепочечными командами, то есть обработка будет осуществляться в направлении возрастания адресов (от начала цепочки к ее концу);
– если DF = 1, то значения индексных регистров SI и DI будут автоматически уменьшаться цепочечными командами, то есть обработка будет осуществляться в направлении убывания адресов (от конца цепочки к ее началу).
Состоянием флага DF можно управлять с помощью двух команд, не имеющих операндов:
– CLD (от англ. Clear Direction Flag – очистить флаг направления) сбрасывает флаг направления DF в ноль;
– STD (от англ. Set Direction Flag – установить флаг направления) устанавливает флаг направления DF в единицу.