Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.11.2011
Репутация: нет Всего: нет
|
Здесь всё что я нашёл связанное с этой командой, программа не большая, помогите написать, буду рад советам подсказкам..) Нужна программа роботы с командами STOS..и ещё как то сделать экранный интерфейс!!! | Код | Перенос элемента из аккумулятора в цепочку Операция-примитив переноса элемента из аккумулятора в цепочку'позволяет про- извести действие, обратное действию команды LODS, то есть сохранить значение из регистра-аккумулятора в элементе цепочки. Эту операцию удобно использовать вместе с операциями поиска (сканирования) SCANS и загрузки LODS с тем, чтобы, найдя нужный элемент, извлечь его в регистр и записать на его место новое значе- ние. Команды, поддерживающие эту операцию-примитив, могут работать с: эле- ментами размером 8, 16 или 32 бита. ТASM предоставляет программисту четыре команды сохранения элемента цепочки из регистра-аккумулятора, работающие с элементами разного размера: STOS адрес_приемника — сохранить в цепочке элемент (STOre String) из регист- ра-аккумулятора AL/AX/EAX; STOSB — сохранить в цепочке байт (STOre String Byte) из регистра AL; STOSW — сохранить в цепочке слово (STOre String Word) из регистра АХ; STOSD — сохранить в цепочке двойное слово (STOre Siring Double Word) из ре- гистра ЕАХ.
Команда STOS Синтаксис команды STOS: stos адрес_приемника Команда имеет один операнд адрес_приемника, адресующий цепочку в допол- нительном сегменте данных. Команда пересылает элемент из аккумулятора (реги- стра EAX/AX/AL) в элемент цепочки по адресу, соответствующему содержимому пары регистров ES:EDI/DI. При этом содержимое EDI/DI подвергается инкременту или декременту (в зависимости от состояния флага DF) па величину, равную размеру элемента цепочки. Префикс повторения в этой команде может и не понадобиться — все зависит от логики программы. Например, если использовать префикс повторения REP, то мож- но применить команду для инициализации области памяти некоторым фиксиро- ванным значением. В качестве примера рассмотрим листинг 12.5, в котором производится замена в строке всех символов «а» символами, вводимыми с клавиатуры.
Замена командой STOS символа в строке символом, вводимым с клавиатуры
MASM MODEL small STACK 256 .data ;сообщения fnd db 0ah,0dh,'Символ найден','$' nochar db 0ah ,0dh,'Символ не найден.'.'$' mesl db Oah,0dh,'Исходная строка:','$' string db "Поиск символа в этой строке.",0ah,0dh,'$' ;строка для поиска rnes2 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 ;вивод стринг cld ;сбросфлага DF lea di,string ;загрузка в di смещения string mov сx,28 ;для префикса repne - длина строки ;поиск в строке string до тех пор, пока ;символ в al и очередной символ в строке ;не равны: выход — при первом совпадении cycl: mov al,'a';символ для поиска - "а"(кириллица) repne scas string je found ;если элемент найден, то переход на found mov ah,09h lea dx,nochar;иначе, если не найден, то вывод сообщения 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;конец программы
110.Описание системы команд микропроцессоров Intel.Команда STOS/STOSB/STOSW/STOSD. (Store String Byte/Word/Double word operands) Сохранение строки байтов/слов/двойных слов Схема команды: stos приемник stosb stosw stosd Назначение: сохранение элемента из регистра-аккумулятора al/ax/eax в последовательности (цепочке). Алгоритм работы: записать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi. Размер элемента определяется неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd); изменить значение регистра di на величину, равную длине элемента цепочки. Знак этого изменения зависит от состояния флага df: df=0 - увеличить, что означает просмотр от начала цепочки к ее концу; df=1 - уменьшить, что означает просмотр от конца цепочки к ее началу. Применение: Команды сохраняют элемент из регистров al/ax/eax в ячейку памяти. Перед командой stos можно указать префикс повторения rep, в этом случае появляется возможность работы с блоками памяти, заполняя их значениями в соответствии с содержимым регистра ecx/cx.
(Store String Byte/Word/Double word operands) Сохранение строки байтов/слов/двойных слов Схема команды: stos приемник stosb stosw stosd Назначение: сохранение элемента из регистра-аккумулятора al/ax/eax в последовательности (цепочке).
Синтаксис:
Алгоритм работы:
записать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi. Размер элемента определяется неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd); изменить значение регистра di на величину, равную длине элемента цепочки. Знак этого изменения зависит от состояния флага df: df=0 — увеличить, что означает просмотр от начала цепочки к ее концу; df=1 — уменьшить, что означает просмотр от конца цепочки к ее началу. Состояние флагов после выполнения команды: выполнение команды не влияет на флаги Применение: Команды сохраняют элемент из регистров al/ax/eax в ячейку памяти. Перед командой stos можно указать префикс повторения rep, в этом случае появляется возможность работы с блоками памяти, заполняя их значениями в соответствии с содержимым регистра ecx/cx.
;заполнить некоторую область памяти пробелами str db 'Какая-то строка' len_str=$-str ... mov ax,@data mov ds,ax mov es,ax cld mov al,' ' lea di,str mov cx,len_str rep stosb ;заполняем пробелами строку str ;пример совместной работы stosb и lodsb: ;копировать одну строку в другую до первого пробела str1 db 'Какая-то строка' len_str1=$-str str2 db len_str1 dup (' ') ... mov ax,@data mov ds,ax mov es,ax cld mov cx,len_str1 lea si,str1 lea di,str2 m1: lodsb cmp al,' ' jc exit ;выход, если пробел stosb loop m1 exit:
STOS записать содержимое регистра AL или AX в память;
|
Это сообщение отредактировал(а) yoko - 3.11.2011, 19:37
|