stos адрес_приемника (STOrage String) — сохранить элемент из регистра-аккумулятора al/ax/eax в цепочке.
Команда имеет один операнд адрес_приемника, адресующий цепочку в дополнительном сегменте данных.
Работа команды заключается в том, что она пересылает элемент из аккумулятора (регистра eax/ax/al) в элемент цепочки по адресу, соответствующему содержимому пары регистров es:edi/di. При этом содержимое edi/di подвергаются инкременту или декременту (в зависимости от состояния флага df) на значение, равное размеру элемента цепочки.
Префикс повторения в этой команде может и не понадобиться — все зависит от логики программы. Например, если использовать префикс повторения rep, то можно применить команду для инициализации области памяти некоторым фиксированным значением.
В качестве примера рассмотрим листинг 5. Программа производит замену в строке всех символов “а” на другой символ. Символ для замены вводится с клавиатуры.
Листинг 5. Замена командой stos символа в строке на вводимый с клавиатуры;prg_11_5.asmMASMMODEL smallSTACK 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 на dsmov ah,09h lea dx,mes1 int 21h ;выводсообщения mes1 lea dx,stringint 21h ;вывод string mov al,'а' ;символ для поиска-`а`(кириллица) cld ;сброс флага df lea di,string ;загрузка в di смещения string mov cx,29 ;для префикса repne — длина строки;поиск в строке string до тех пор, пока;символ в al и очередной символ в строке;не равны: выход - при первом совпаденииcycl:repne scas string je found ;если элемент найден то переход на foundfailed: ;иначе, если не найден, то вывод сообщения nocharmov ah,09h lea dx,nocharint 21h jmp exit ;переход на выходfound: mov ah,09h lea dx,fndint 21h ;вывод сообщения об обнаружении символа;корректируем di для получения значения;действительной позиции совпавшего элемента;в строке и регистре al dec dinew_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,stringint 21h ;вывод сообщения string;переход на поиск следующего символа ‘а’ встроке inc di ;указатель в строке string на следующий, ;после совпавшего, символ jmp cycl ;на продолжение просмотра stringexit: ;выход mov ax,4c00h int 21hend main ;конец программы
Следующие две команды появились впервые в системе команд микропроцессора i386. Они позволяют организовать эффективную передачу данных между портами ввода-вывода и цепочками в памяти. Следует отметить, что эти две команды позволяют достичь скорости передачи данных со скоростью выше той, которую может обеспечить контроллер DMA (Direct Memory Access — прямой доступ к памяти). Контроллер DMA — это специальная микросхема, предназначенная для того, чтобы освободить микропроцессор от управления процессом ввода-вывода больших массивов данных между внешним устройством (диском) и памятью.