- •Глава 12
- •Пересылка цепочек
- •Команда movs
- •Пересылка байтов, слов и двойных слов
- •Сравнение цепочек
- •Команда cmps
- •Сравнение байтов, слов и двойных слов
- •Сканирование цепочек
- •Команда scas
- •Сканирование строки байтов, слов, двойных слов
- •Загрузка элемента цепочки в аккумулятор
- •Команда lods
- •Загрузка в регистр al/ax/eax байтов, слов, двойных слов
- •Перенос элемента из аккумулятора в цепочку
- •Команда stos
- •Сохранение в цепочке байта, слова, двойногослова из регистра al/ax/eax
- •Работа с портами ввода-вывода
- •Ввод элемента цепочки из порта ввода-вывода
- •Вывод элемента цепочки в порт ввода-вывода
Сохранение в цепочке байта, слова, двойногослова из регистра al/ax/eax
Команды STOSB, STOSW и STOSD, аналогично другим цепочечным операциям, являются вариантами команды STOS. Каждая из этих команд работает с цепочками из элементов определенного размера. Предварительно необходимо загрузить значение длины цепочки и ее адрес в регистры ЕСХ/СХ и ES:EDI/DI.
Работа с портами ввода-вывода
Описанные далее две команды появились впервые в системе команд процессора i386. Они позволяют организовать эффективную передачу данных между портами ввода-вывода и цепочками в памяти. Следует отметить, что эти две команды позволяют достичь более высокой скорости передачи данных по сравнению с той скоростью, которую может обеспечить контроллер DMA (Direct Memory Access прямой доступ к памяти).
Ввод элемента цепочки из порта ввода-вывода
Операция ввода элемента цепочки из порта ввода-вывода реализуется командой INS (Input String), имеющей следующий формат:
ins адрес_приемника,номер_порта
Эта команда вводит элемент из порта, номер которого находится в регистре DX, в элемент цепочки, адрес памяти которого определяется операндом адрес_приемника. Несмотря на то, что цепочка, в которую вводится элемент, адресуется указанием этого операнда, ее адрес должен быть явно сформирован в паре регистров ES:EDI/DI. Размер элементов цепочки должен быть согласован с размером порта -он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки. После пересылки команда INS производит коррекцию содержимого регистра EDI/DI на величину, равную размеру элемента, участвовавшего в операции пересылки. Как обычно, при работе цепочечных команд учитывается состояние флага DF.
Подобно командам, реализующим рассмотренные ранее цепочечные операции примитивы, транслятор преобразует команду INS в одну из трех машинных команд
без операндов, работающих с цепочками элементов определенного размера:
INSB (INput String Byte) — ввести из порта цепочку байтов;
INSW (INput String Word) — ввести из порта цепочку слов;
INSD (INput String Double Word) — ввести из порта цепочку двойных слов.
К примеру, введем из порта 5000h 10 байтов в область памяти pole:
.data
pole db 10 dup (" ")
.code
…
push ds
pop es ;настройка es на ds
mov dx,5000h
lea di.pole
mov ex,10
rep insb
…
Вывод элемента цепочки в порт ввода-вывода
Операция вывода элемента цепочки в порт ввода-вывода реализуется командой OUTS (Output String), имеющей следующий формат:
outs номер_порта,адрес_источника
Эта команда выводит элемент цепочки в порт, номер которого находится в регистре DX. Адрес элемента цепочки определяется операндом адрес_источника. Несмотря на то, что цепочка, из которой выводится элемент, адресуется указанием этого операнда, значение адреса должно быть явно сформировано в паре регистров DS:ESI/SI. Размер структурных элементов цепочки должен быть согласован с размером порта — он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки. После пересылки команда OUTS производит коррекцию содержимого регистра ESI/SI на величину, равную размеру элемента цепочки, участвовавшего в операции пересылки.При этом, как обычно, учитывается состояние флага DF.
Подобно команде INS транслятор преобразует команду OUTS в одну из трех машинных команд без операндов, работающих с цепочками элементов определенного размера:
OUTSB (OUTput String Byte) - вывести цепочку байтов в порт ввода-вывода;
OUTSW (OUTtput String Word) — вывести цепочку слов в порт ввода-вывода;
OUTSD (OUTput String Double Word) — вывести цепочку двойных слов в порт ввода-вывода.
В качестве примера рассмотрим фрагмент программы, которая выводит последовательность символов в порт ввода-вывода с номером 378 (Iptl), соответствующий принтеру:
. data
str__pech db "Текст для печати"
.code
…
mcv d x , 3 7 8 h
lea di,str_pech
mov ex,16
rep outsb
…
Для организации работы с портами недостаточно знать их номера и назначение. Hе менее важно знать и понимать алгоритмы их работы. Эти сведения можно найти в документации на устройство (но, к сожалению, далеко не всегда).
Итоги
Система команд процессора имеет очень интересную группу команд, позволяющих производить действия над блоками элементов до 64 Кбайт или 4 Гбайт в зависимости от установленной разрядности адреса — use16 или use32.
Блоки элементов логически могут представлять собой последовательности элементов с любыми значениями, хранящимися в памяти в виде двоичных кодов. Единственное ограничение состоит в том, что размеры элементов в этих блоках памяти фиксированы значением 8, 16 пли 32 бита.
Команды обработки строк обеспечивают возможность выполнения семи операций-примитивов, обрабатывающих цепочки поэлементно.
Каждая операция-примитив представлена тремя разными машинными командами и одной псевдокомандой, которая преобразуется транслятором в одну из трех упомянутых ранее машинных команд. Вариант преобразования определяется типом операндов в команде.
Процессор всегда предполагает, что строка-приемник находится и дополнительном сегменте (адресуемом посредством сегментного регистра ES), а строка-источник -в сегменте данных (адресуемом посредством сегментного регистра DS).
Процессор адресует строку-приемник через регистр EDI/DI, а строку-источник -через регистр ESI/SI.
Допускается переопределять сегмент для строки-источника, для строки-приемника этого делать нельзя.
Особенность работы цепочечных команд состоит в том, что они автоматически выполняют приращение или уменьшение содержимого регистров EDI/DI и ESI/SI в зависимости от используемой цепочечной команды. Что именно происходит с этими регистрами, определяйся состоянием флага DF, которым управляют команды CLD и 5TD. Значение, на которое изменяется содержимое индексных регистров, определяется типом элементов строки или кодом операции цепочечной команды.