Справочник по языку Ассемблера IBM PC

       

INS/INSB/INSW/INSD


(Input String Byte/Word/Double word operands)

Ввод строк байтов/слов/двойных слов из порта

 

Схема команды:  ins приемник,порт 
insb 
insw 
insd

Назначение: ввод из порта в память последовательности байт, слов, двойных слов.


Алгоритм работы:

передать данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di;

в зависимости от состояния флага df изменить значение регистров edi/di:

если df=0, то увеличить содержимое этих регистров на длину структурного элемента последовательности;



если df=1, то уменьшить содержимое этих регистров на длину структурного элемента последовательности;

при наличии префикса выполнить определяемые им действия (см. команду rep).

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:


Команда вводит данные из порта ввода-вывода, номер которого загружен в регистр dx, в память по адресу es:edi/di. Сегментная составляющая адреса должна быть обязательно в регистре es. Замена сегментного регистра недопустима. Непосредственное задание порта в команде также недопустимо - для этого используется регистр dx. Размеры вводимых элементов зависят от применяемой команды. Команда ins может работать с элементами размером в байт, слово, двойное слово. В качестве операндов в команде указывается символическое имя ячейки памяти, в которую вводятся элементы из порта ввода-вывода. Реально это символическое имя используется лишь для получения типа элемента последовательности, а его адрес должен быть предварительно загружен в пару регистров es:edi/di. Транслятор, обработав команду ins и выяснив тип операнда, генерирует одну из машинных команд insb, insw или insd. Машинного аналога для команды ins нет. Для того чтобы эти команды можно было использовать для ввода последовательности элементов, имеющих размерность байт, слово, двойное слово, необходимо использовать префикс rep. Префикс rep заставляет циклически выполняться команду ввода до тех пор, пока содержимое регистра ecx/cx не станет равным нулю.

.286 ;ввести 10 байт из порта 300h (номер порта bgr условно) ;в цепочку байт в памяти по адресу str_10  db      10 dup(0) adr_str dd      str_10         les     di,adr_str         mov     dx,300h rep     insb ...         

См. также: уроки 2, 11 и команды , , , , , ,



Содержание раздела