Хелпикс

Главная

Контакты

Случайная статья





Команды обработки строк



Команды обработки строк

Строковые команды используются для быстрой и эффективной работы с таблицами чисел или со строками символов. Как известно, нельзя с помощью одной команды 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

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.