Ввод элемента цепочки из порта ввода-вывода



Данная операция позволяет произвести ввод цепочки элементов из порта ввода-вывода и реализуется командой ins, имеющей следующий формат:

ins адрес_приемника,номер_порта (Input String) - ввести элементы из порта ввода-вывода в цепочку.

Эта команда вводит элемент из порта, номер которого находится в регистре dx, в элемент цепочки, адрес которого определяется операндом адрес_приемника.

Несмотря на то, что цепочка, в которую вводится элемент, адресуется указанием этого операнда, ее адрес должен быть явно сформирован в паре регистров es:edi/di.

Размер элементов цепочки должен быть согласован с размерностью порта — он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки.

После пересылки команда ins производит коррекцию содержимого edi/di на величину, равную размеру элемента, участвовавшего в операции пересылки. Как обычно, при работе цепочечных команд учитывается состояние флага df.

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

insb (INput String Byte) — ввести из порта цепочку байт;

insw (INput String Word) — ввести из порта цепочку слов;

insd (INput String Double Word) — ввести из порта цепочку двойных слов.

К примеру, выведем 10 байт из области памяти pole в порт 5000h.

.datapole db 10 dup (‘ ‘).code... push ds pop es ;настройка es на ds mov dx,5000h lea di,pole mov cx,10rep insb...

Вывод элемента цепочки в порт ввода-вывода

Данная операция позволяет произвести вывод элементов цепочки в порт ввода-вывода. Она реализуется командой outs, имеющей следующий формат:

outs номер_порта,адрес_источника (Output String) — вывести элементы из цепочки в порт ввода-вывода.

Эта команда выводит элемент цепочки в порт, номер которого находится в регистре dx. Адрес элемента цепочки определяется операндом адрес_источника. Несмотря на то, что цепочка, из которой выводится элемент, адресуется указанием этого операнда, значение адреса должно быть явно сформировано в паре регистров ds:esi/si.

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

После пересылки команда outs производит коррекцию содержимого esi/si на величину, равную размеру элемента цепочки, участвовавшего в операции пересылки. При этом, как обычно, учитывается состояние флага df.

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

outsb (OUTput String Byte) — вывести цепочку байт в порт ввода-вывода;

outsw (OUTtput String Word) — вывести цепочку слов в порт ввода-вывода;

outsd (OUTput String Double Word) — вывести цепочку двойных слов в порт ввода- вывода.

В качестве примера рассмотрим фрагмент программы, которая выводит последовательность символов в порт ввода-вывода, соответствующего принтеру (номер 378 (lpt1)).

.datastr_pech db 'Текст для печати'.code... mov dx,378h lea di,str_pech mov cx,16rep outsb...

В заключение напомню, что для организации работы с портами недостаточно знать их номера и назначение. Не менее важно знать и понимать алгоритм их работы. Эти сведения можно найти в документации на устройство (но, к сожалению, далеко не всегда).

 


Дата добавления: 2019-09-13; просмотров: 176; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!