Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите розобратся, программа с командой STOS 
:(
    Опции темы
yoko
  Дата 3.11.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
iff
Дата 3.11.2011, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Цитата(yoko @  3.11.2011,  19:18 Найти цитируемый пост)
Здесь всё что я нашёл связанное с этой командой

Зачем? Вы считаете, что в этом разделе могут быть люди, которые не знают элементарных инструкций процессора?!
Зачем используете тег "код" для текста?! Он не допускает перевода строки, и из-за строк 125 и 147 страница "растинулась" в ширину так, что приходится искать некоторые элементы на ней при помощи горизонтального скроллбара.
Цитата(yoko @  3.11.2011,  19:18 Найти цитируемый пост)
программа не большая, помогите написать, буду рад советам подсказкам

Если вы хотете что-бы за вас написали программу, то отправляйтесь в центр помощи (думаю, модератор туда и перенесёт эту тему); можете составить конкретное задание и обратиться ко мне, например (через личную почту).
Если вы хотите совета или подсказки, то:
  • Прочитайте ту справку, которую вы разместили
  • Сформулируйте задачу, которую должна выполнять программа
  • Составте алгоритм
  • Напишите программу



--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1272 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.