Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция 7 / Лекция 7.doc
Скачиваний:
23
Добавлен:
10.06.2015
Размер:
159.23 Кб
Скачать

Сохранение в цепочке байта, слова, двойногослова из регистра 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. Значение, на которое изменяется содержимое индексных регистров, определяется типом элементов строки или кодом операции цепочечной команды.

Соседние файлы в папке Лекция 7