|
|||
Команды обработки строк ⇐ ПредыдущаяСтр 7 из 7 Команды обработки строк Строковые команды используются для быстрой и эффективной работы с таблицами чисел или со строками символов. Как известно, нельзя с помощью одной команды MOV переписать данные из одной переменной в другую Строковые команды позволяют это и многое другое. Существуют общие правила, верные для всех строковых команд: · Строковые команды применяют для работы индексные регистры: SI (для адресации таблицы-источника — в нем хранится смещение элемента таблицы относительно начала сегмента) и DI (для адресации таблицы-приемника). · Предполагается, что таблица-источник находится в сегменте данных, то есть адресуется DS, а таблица-приемник — в дополнительном сегменте, то есть адресуется ES. Если мы хотим, чтобы и источник, и приемник находились в одном и том же сегменте, например, необходимо установить ES равным DS. Как это сделать? Например так: PUSH ds POP es · В результате работы строковой команды, кроме основного действия с элементами таблиц, автоматически меняются индексные регистры так, чтобы указывать на следующий элемент таблицы. · Направление обработки строк зависит от значения флага направления DF. Если DF=0, то слева направо, в противном случае — справа налево. · Строковые команды не имеют явных операндов, они подразумеваются, то есть являются неявными. Теперь рассмотрим строковые команды по группам: 1) MOVSB, MOVSW, MOVSD — пересылка байта (или слова, или двойного слова) из строки источника в строку-приемник (строки адресуются индексными регистрами): DS:[SI] ES:[DI] Задание Переписать информацию из одной таблицы слов в другую. .......... tabl1 dw 1,-3,9,15,2,8 tabl2 dw 8 dup (?) .......... mov cx,8 lea si,tabl1 lea di,tabl2 push ds pop es met: MOVSW ; здесь нет наращивания индексных регистров явно, ; это делается по MOVSW автоматически loop met ................
2)LODSB, LODSW, LODSD —загрузка из строки-источника байта в регистр AL (или слова в регистр AX, или двойного слова в регистр EAX). Строка-источник адресуется DS:[SI]:
DS:[SI] AL AX EAX Задание Переписать из таблицы байтов 2-ий элемент в регистр al. ........... tabl db 10,20,30,40,50 ........... lea si,tabl add si,2 LODSB ; в AL окажется число 30 ........... 3) STOSB, STOSW, STOSD — запись байта из регистра AL (или слова из регистра AX, или двойного слова из регистра EAX) в строку-приемник. Строка адресуется ES:[DI]: AL ES:[DI] AX EAX Задание Записать в таблицу число 50 на место 0-ого элемента. .............. tabl dw 5 dup (?) .............. lea di,tabl push ds pop es mov al,50 stosw ; в таблицу на место 0 элемента запишется число 50 ............ 4) CMPSB, CMPSW, CMPSD — сравнение текущих элементов строки источника и строки приемника. Устанавливаются флаги ZF, SF, CF в зависимости от результата сравнения. Строки адресуются: DS:[SI] ? ES:[DI] 5)SCASB, SCASW, SCASD — сканирование, то есть сравнение в строке-приемнике текущего элемента с байтом, находящимся в регистре AL (или словом, находящимся в регистре AX, или двойным словом из EAX). Устанавливаются флаги ZF, SF, CF по результату сравнения. Строка адресуется: ES:[DI]. AL ? ES:[DI] AX ? ES:[DI] EAX ? ES:[DI] 6) REP, REPE(REPZ), REPNE(REPNZ) — префиксы повторения строковых команд. REP строковая_команда REPZ(E) строковая_команда REPNZ(E) строковая_команда Префикс REP приводит к тому, что строковая команда, следующая за ним, будет выполняться определенное число раз (указывается в регистре CX). Значение в CX после каждого выполнения строковой команды уменьшается на 1. REPZ(E) — повторять, пока 0, т.е. ZF=1, REPNZ(E) — повторять, пока не 0, т.е. ZF=0 Эти префиксы повторений указывают, что команды будут повторяться, пока не изменится флаг ZF, например, после операций CMPSB(W) или SCASB(W), либо, если ZF не изменится, то пока CX не будет равен 0 Задания 1)Необходимо переписать байты из одной таблицы в другую, используя префикс повторения. .MODEL SMALL .DATA TABL DB 1,2,3,4,5,6,7,8,9,10 TABL1 DB 10 DUP (?) .CODE .STARTUP PUSH DS POP ES ; сегмент данных и дополнительный сегмент совпадают LEA SI,TABL LEA DI,TABL1 MOV CX,10 REP MOVSB; после выполнения всех команд MOVSB CX станет ;равным 0 .EXIT 0 END 2)Необходимо определить, существует ли в таблице некоторое число. .MODEL SMALL .DATA TABL DB 10 DUP (?) chislo db ? .CODE .STARTUP ; ввод элементов в таблицу TABL ; ввод числа, которое необходимо найти в таблице PUSH DS POP ES ; сегмент данных и дополнительный сегмент теперь ;совпадают LEA dI,TABL MOV CX,10 mov al,chislo REPne scasb ; происходит выход из цикла раньше, если число ; найдено JZ MET ; тогда флаг ZF равен 1 ; вывод сообщения "число НЕ НАЙДЕНО" jmp en MET: ; вывод сообщения "число НАЙДЕНО" EN: .EXIT 0 END 3)Определить номер первого справа символа “\” в строке символов (например, это может быть путь к файлу). .model small .data stroka db 'a:\pr\a.txt' str_len equ $-stroka nomer dw ? .code .startup push ds pop es std lea di,stroka mov cx,str_len add di,cx dec di ; возвращаемся на 1 позицию обратно к последнему ; символу строки mov al,'\' repne scasb jnz no mov nomer,cx ; cx изменяется по REPNE jmp konec no: ; вывод сообщения 'не найдено' mov ah,2 mov dl,’N’ int 21h konec: .exit 0 end
|
|||
|