Последний уровень раздела предыдущего изложения   Текущий уровень изложения предыдущего раздела   Текущий уровень изложения следующего раздела   Первый уровень изложения следующего раздела   Уровень: Глоссарии:


Команды обработки строк (цепочек байтов)



1. LODSB ; команда lodsb загружает байт адресованный регистром SI из сегмента данных, и увеличивает SI на 1, если перед этим была введена команда CLD (очистить флаг направления DF ) и уменьшает SI на 1, если была использована команда STD (установить флаг направления).



 ....
 .DATA
string DB 'abcdefg'
 .CODE
 ....
 cld;после выполнения этих команд в AL будет
 mov si,OFFSET [string+2]; загружен ASCII код 'с'
 lodsb;причем содержимое SI будет указывать на 'd'.


2. MOVSB; эта команда перемещает один байт из ячейки памяти с адресом в регистре SI в ячейку памяти с адресом в регистре DI и увеличивает (SI) и (DI) на 1. Значение SI может находиться, как в сегменте данных DS , так и в дополнительном сегменте ES. Значение DI может находиться только в дополнительном сегменте ES.




 ....
 .DATA
 msg  DB 'Всё O.K.'
 LEN  = $ - msg;LEN равно 8
 .CODE
 ....
 cld
 lea si,msg;в SI адрес источника
 mov ax,0b800h;начало сегмента видеопамяти
 mov es,ax;поместить в дополнительный сегмент
 lea di,es:(0a0h * 3);4-я строка сверху
 mov cx,LEN;LEN - количество выводимых символов
rp:   movsb;переслать символ в текущую позицию экрана
 inc di;перешагнуть через позицию атрибута
 loop rp;повторить до исчерпания (CX)
 ....;строка 'Всё O.K.' будет выведена в 4-ю строку
 ;дисплея сверху.


3. REP ;префикс повторения команды. Например окончание предыдущей программы может быть записано в виде:



 ....
 mov cx,LEN;несмотря на то,что массив'Всё O.K.'будет
rep   movsb;скопирован в область памяти B800:(A0 * 3), на
 ;экран дисплея будет выведено: ВёOK. Почему?


4. CMPSB; осуществляет сравнение байта строки источника c адресом (SI) и байта строки приемника с адресом (DI): то есть производит вычитание ((SI)) - ((DI)). Не путать с командой CMP DST, SRC в которой наоборот, производится вычитание источника из приемника. Команда CMPSB неявно уменьшает (CX) на 1 и увеличивает (SI) и (DI) на 1, если (DF) = 0.



5. REPZ или REPE; префикс повторения. Выполнение команды завершается, когда (CX) = 0 или (ZF) = 0.



 ....
 .DATA
src  DB 'To be, or not to be'
dst  DB 'To be ,or not to be'
len  = $ - dst;len равно 19
 .CODE
 ....
 cld; (DF) = 0
 push ds;совместить адреса
 pop es;сегментов ds и es
 mov cx,len;длину строки dst переслать в cx
 lea di,dst;загрузить адрес(смещение) строки dst в DI
 lea si,src
repe cmpsb;сравнивать побайтно
 je equal;если все байты совпали, то перейти к метке
 not cx;если нет - вычислить номер несовпадающих байт
 add cx,len;
 jmp notequal;
equal:    ....
 ....
notequal: ....


В конце этого примера номер первого несовпадающего байта (CX) = 5. Не забывайте, что номера символов в строке начинаются с нуля и пробел тоже считается символом.