(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,300hrep insb... |
См. также: уроки 2, 11 и команды cmps/cmpsb/cmpsw/cmpsd, lods/lodsb/lodsw/lodsd, movs/movsb/movsw/movsd, outs, scas/scasb/scasw/scasd, stos/stosb/stosw/stosd, rep/repe/repz/repne/repnz