Связь с администрацией сайта:       

demo

Среди толпы я одинок

Глава 13 - строковые команды

Строкой в Ассемблере называют последовательность байтов или слов длинной от 1 до 65535 байт. Операции со строками обеспечивают пересылку, сравнение, сканирование строк по значению, а также пересылку строки в аккумулятор или из него. Каждая строковая операция представленная в процессоре двумя командами: одна предназначена для обработки строк состоящих из байт, другая – из слов (их мнемоника различается наличием буквы B (byte) или W (word)).

 

Если флаг направления DF перед выполнением команды строковой обработки установлен в 0 (выполнена команда CLD), значение в индексном регистре автоматически увеличивается, если в 1 (выполнена STD) – уменьшается. Индексные регистры уменьшаются или увеличиваются на 1, если команды работают с байтами, или на 2 – если со словами.

Команды строковой обработки чаще всего используются с однобайтными префиксами (префиксами повторения), которые обеспечивают многократное автоматическое повторение выполнения команды.

Команда сравнения строк CMPS (CMPSB, CMPSW).

Команда CMPS сравнивает значение элемента одной строки (DS:SI) со значением элемента второй строки (ES:DI) и настраивает значения регистров на следующие элементы строк в соответствии с флагом направления DF. Сравнение происходит как и по команде сравнения CMP. Результат – сформированные флаги. 

Команда сканирования строки SCAS (SCASB, SCASW).

Команда SCAS производит сравнение содержимого регистра (AL или AX) с байтом памяти, абсолютный адрес которого определяется парой ES:DI, после чего регистр DI устанавливается на соседний элемент памяти (байт или слово) в соответствии с флагом DF. Команда SCAS используется обычно для поиска в строке (ES:DI) элемента заданного в регистре AL или AX.

Команда пересылки строки MOVS (MOVSB, MOVSW).

Команда MOVS пересылает поэлементно строку DS:SI в строку ES:DI и настраивает значения индексных регистров на следующий элемент строки.

Команда сохранения строки STOS (STOSB, STOSW).

Команда STOS заполняет строку, содержащуюся по адресу ES:DI, элементом из регистра AL или AX. На флаги команда не влияет

Команда загрузки строки LODS (LODSB, LODSW).

Команда LODS записывает в регистр AL или AX содержимое ячейки памяти, адрес которой задается регистрами DS:SI. Флаги не меняются.

Префиксы повторения.

В системе команд процессора имеется две команды без операндов, которые называются префиксами повторения:
1-ый префикс: REPE (повторять, пока равно)
REPZ (повторять, пока ноль)
REP (повторять)
2-ой префикс: REPNE (повторять, пока не равно)
REPNZ (повторять, пока не ноль)

Префиксы повторения ставятся перед строковыми командами обязательно в той же строке, например:
REPE CMPB

Префикс использует регистр CX как счетчик циклов. На каждом этапе цикла выполняются следующие действия:

1) Проверка CX. Если он равен 0 – выход из цикла и переход к следующей команде.

2) Подтверждение любых возникающих прерываний.

3) Выполнение указанной строковой операции.

4) Уменьшение CX на единицу, флаги при этом не изменяются.

5) Проверка флага ZF, если выполняется строковая операция SCAS или CMPS. Если условие повторения цикла не выполняется – выход из цикла и переход к следующей команде. Выход из цикла, если префиксом является REPE и ZF=0 (последнее сравнение не совпало) или используется префикс REPNE и ZF=1 (последнее сравнение не совпало).

6) Изменение значения индексных регистров в соответствии со значением флага направления и переход на начало цикла.

Фрагмент программы, иллюстрирующий работу со строковыми данными, приведен ниже.
CLD ;DF=0
LEA SI,s1 ;DS:SI=начало s1
LEA DI,s2 ;ES:DI=начало s2
MOV CX,n ;CX=длинна строк
REPE CMPSB ;сравнение, пока элементы равны 
JNE NoEq ;если s1<>s2 (ZF=0), то на NoEq
...
NoEq:
...

 

 

Rate this item
(0 votes)
Login to post comments