sStos адреса_приймача
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, що має такий вигляд: