Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._13.doc
Скачиваний:
2
Добавлен:
11.08.2019
Размер:
256.51 Кб
Скачать

s

Stos адреса_приймача

tosd (STOre String Double Word) - зберегти подвійне слово з регістра eax в ланцюжку

Команда stos

Команда має один операнд адреса_приймача, що адресує ланцюжок в додатковому сегменті даних. Робота команди полягає в тому, що вона пересилає елемент з акумулятора (регістра eax/ax/al) в елемент ланцюжка за адресою, що відповідає вмісту пари регістрів es:edi/di. При цьому вміст edi/di піддаються інкременту або декременту (в залежності від стану прапора df) на значення, що дорівнює розміру елемента ланцюжка. Префікс повторення в цій команді може і не знадобитися - все залежить від логіки програми. Наприклад, якщо використовувати префікс повторення rep, то можна застосувати команду для ініціалізації області пам'яті деяким фіксованим значенням.

В якості прикладу розглянемо лістинг 5. Програма проводить заміну в рядку всі знаки "а" на інший символ. Символ для заміни вводиться з клавіатури

Лістинг 5. Заміна командою stos символу в рядку на символ, що вводиться з клавіатури

;prg_13_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 — це спеціальна мікросхема, призначена для того, щоб звільнити мікропроцесор від управління процесом вводу-виводу великих масивів даних між зовнішнім пристроєм (диском) і пам'яттю.

7. Введення елемента ланцюжка з порту вводу-виводу

Дана операція дозволяє провести введення ланцюжка елементів з порту вводу-виводу і реалізується командою ins, що має такий вигляд:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]