Movs адрес_приемника,адрес_источника
Цепочечные команды
Кроме привычного всем понятия массивов в ассемблере существует структура называемая цепочкой. Цепочка - непрерывная последовательность байт, слов или двойных слов, обрабатываемая как единое целое. Основное отличие цепочек от массивов состоит в способе доступа к элементам: для массивов - произвольный доступ, для цепочек - только последовательный (от начала цепочки к концу или от конца к началу). Цепочечные команды - команды для обработки цепочек. Особенностью всех цепочечных команд (кроме обработки очередного элемента цепочки) является автоматическое продвижение к следующему элементу цепочки.
Цепочечные команды:
Название | Команды | Действие |
пересылка цепочки | movs <адр. приемника>, <адр. источника> movsb, movsw, mowsd | копирует один элемент цепочки из операнда источника в операнд приемник |
сравнение цепочек | cmps <адр. приемника>, <адр. источника> cmpsb, cmpsw, cmpsd | сравнивает элементы цепочек из операнда источника и операнда приемника |
сканирование цепочки | scas <адр. приемника> scasb, scasw, scasd | сканирует цепочку приёмник на присутствие некоторого элемента (задаётся в регистре аккумуляторе) |
загрузка элемента из цепочки | lods <адр. источника> lodsb, lodsw, lodsd | загрузить элемент из цепочки источника в регистр аккумулятор |
сохранение элемента в цепочке | stos <адр. приемника> stosb, stosw, stosd | восстановить элемент из регистра аккумулятора в цепочку |
получение элемента цепочки из порта ввода/вывода | ins <адр. приемника>, <номер порта> insb, insw, insd | загрузить элемент в цепочку приемник из указанного порта ввода/вывода |
вывод элементов цепочки в порт ввода/вывода | outs <номер порта>, <адр. источника> outbs, outws, outds | переслать элемент из цепочки источника в указанный порт ввода/вывода |
Особенности использования
Адресация операндов
цепочка источник - ds:si
цепочка приёмник - es:di
Направление обработки
1. от начала к концу
df = 0; si и di автоматически увеличиваются
команда cld (clear direction flag) сбрасывает флаг df
2. от конца к началу
df = 1; si и di автоматически уменьшаются
команда std (set direction flag) устанавливает флаг df
Префиксы повторения
Префиксы повторения зацикливают выполнение команды, позволяя обрабатывать всю цепочку одной командой. Префиксы повторения указываются перед нужной цепочечной командой в поле метки. Цепочечная команда без префикса повторения выполняется один раз, с префиксом - в цикле.
rep выполнять, пока cx<>0 (cx уменьшается автоматически);
repe выполнять, пока cx<>0 или zf=1 (cx уменьшается автоматически);
repne выполнять, пока cx<>0 или zf=0 (cx уменьшается автоматически);
Пример: Написать программу копирования строки.
data segment | ||||
s1 db 'Тестируемая строка$' | ;строка которую будем копировать | |||
s2 db 20 dup (' ') | ;строка куда будем копировать | |||
data ends | ||||
code segment | ||||
start: | ||||
assume cs:code, ds: data | ||||
mov ax, data | ||||
mov ds, ax | ;цепочка источник | |||
mov es, ax | ;и цепочка приёмник в одном сегменте | |||
cld | ;обработка от начала к концу | |||
lea si, s1 | ;цепочка источник | |||
lea di, s2 | ;цепочка приёмник | |||
mov cx, 20 | ;количество элементов для обработки | |||
rep | movsb | ;копируем строку | ||
mov ah, 09 | ||||
lea dx, s2 | ||||
int 21h | ;выводим строку-приёмник на экран | |||
mov ax, 4c00h | ||||
int 21h | ||||
code ends | ||||
end start |
Цепочечные команды
Эти команды также называют командами обработки строк символов. Названия почти синонимичны.
Отличие в том, что под строкой символов здесь понимается последовательность байт, а цепочка — это более общее название для случаев, когда элементы последовательности имеют размер больше байта — слово или двойное слово.
Таким образом, цепочечные команды позволяют проводить действия над блоками памяти, представляющими собой последовательности элементов следующего размера:
· 8 бит — байт;
· 16 бит — слово;
· 32 бита — двойное слово.
Содержимое этих блоков для микропроцессора не имеет никакого значения. Это могут быть символы, числа и все что угодно. Главное, чтобы размерность элементов совпадала с одной из перечисленных и эти элементы находились в соседних ячейках памяти.
Всего в системе команд микропроцессора имеется семь операций-примитивов обработки цепочек.
Каждая из них реализуется в микропроцессоре тремя командами, в свою очередь, каждая из этих команд работает с соответствующим размером элемента — байтом, словом или двойным словом.
Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют еще и автоматическое продвижение к следующему элементу данной цепочки.
Перечислим операции-примитивы и команды, с помощью которых они реализуются, а затем подробно их рассмотрим:
· пересылка цепочки:
movs адрес_приемника,адрес_источника
Movsb movsw movsd
· сравнение цепочек: