Команда stos
stos адрес_приемника (STOrage String) — сохранить элемент из регистра-аккумулятора al/ax/eax в цепочке.
Команда имеет один операнд адрес_приемника, адресующий цепочку в дополнительном сегменте данных.
Работа команды заключается в том, что она пересылает элемент из аккумулятора (регистра eax/ax/al) в элемент цепочки по адресу, соответствующему содержимому пары регистров es:edi/di. При этом содержимое edi/di подвергаются инкременту или декременту (в зависимости от состояния флага df) на значение, равное размеру элемента цепочки.
Префикс повторения в этой команде может и не понадобиться — все зависит от логики программы. Например, если использовать префикс повторения rep, то можно применить команду для инициализации области памяти некоторым фиксированным значением.
В качестве примера рассмотрим листинг 5. Программа производит замену в строке всех символов “а” на другой символ. Символ для замены вводится с клавиатуры.
Листинг 5. Замена командой stos символа в строке на вводимый с клавиатуры ;prg_11_5.asm MASM MODEL small STACK 256 .data ;сообщения fnd db 0ah,0dh,'Символ найден','$' nochar db 0ah,0dh,'Символ не найден.','$' mes1 db 0ah,0dh,'Исходная строка:','$' string db 'Поиск символа в этой строке.',0ah,0dh,'$' ;строка для поиска mes2 db 0ah,0dh,'Введите символ, на который следует заменить найденный' db 0ah,0dh,'$' mes3 db 0ah,0dh,'Новая строка: ','$' .code assume ds:@data,es:@data привязка ds и es к сегменту данных main: ;точка входа в программу mov ax,@data ;загрузка сегментных регистров mov ds,ax mov es,ax ;настройка es на ds mov ah,09h lea dx,mes1 int 21h ;вывод сообщения mes1 lea dx,string int 21h ;вывод string mov al,'а' ;символ для поиска-`а`(кириллица) cld ;сброс флага df lea di,string ;загрузка в di смещения string mov cx,29 ;для префикса repne — длина строки ;поиск в строке string до тех пор, пока ;символ в al и очередной символ в строке ;не равны: выход - при первом совпадении cycl: repne scas string je found ;если элемент найден то переход на found failed: ;иначе, если не найден, то вывод сообщения nochar mov ah,09h lea dx,nochar int 21h jmp exit ;переход на выход found: mov ah,09h lea dx,fnd int 21h ;вывод сообщения об обнаружении символа ;корректируем di для получения значения ;действительной позиции совпавшего элемента ;в строке и регистре al dec di new_char: ;блок замены символа mov ah,09h lea dx,mes2 int 21h ;вывод сообщения mes2 ;ввод символа с клавиатуры mov ah,01h int 21h ;в al — введённый символ stos string ;сохраним введённый символ ;(из al) в строке string в позиции старого символа mov ah,09h lea dx,mes3 int 21h ;вывод сообщения mes3 lea dx,string int 21h ;вывод сообщения string ;переход на поиск следующего символа ‘а’ в строке inc di ;указатель в строке string на следующий, ;после совпавшего, символ jmp cycl ;на продолжение просмотра string exit: ;выход mov ax,4c00h int 21h end main ;конец программы |
Следующие две команды появились впервые в системе команд микропроцессора i386. Они позволяют организовать эффективную передачу данных между портами ввода-вывода и цепочками в памяти. Следует отметить, что эти две команды позволяют достичь скорости передачи данных со скоростью выше той, которую может обеспечить контроллер DMA (Direct Memory Access — прямой доступ к памяти). Контроллер DMA — это специальная микросхема, предназначенная для того, чтобы освободить микропроцессор от управления процессом ввода-вывода больших массивов данных между внешним устройством (диском) и памятью.