Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Lektsii_2015.doc
Скачиваний:
105
Добавлен:
22.03.2016
Размер:
1.19 Mб
Скачать

Способы адресации

Адресация – это задание адреса хранения операнда.

Существуют следующие способы адресации.

  1. Регистровая адресация:

mov ax, bx

push ds

  1. Непосредственная адресация:

mov ax, 2

  1. Прямая адресация:

mov ax, х

  1. Косвенная адресация:

mov ax, [bх]

  1. Базовая, адресация по базе со сдвигом:

mov ax, [bх+2]

mov di, [bp+4]

  1. Индексная адресация:

mov ax, mas[si]

  1. Базово-индексная адресация:

mov ax, [bx+si+2]

Команды строковых примитивов

Команда

Описание

Операнды

MOVS

Перемещает строки данных: копирует байт или слово из одного участка памяти в другой

MOVS [DI], [SI]

CMPS

Сравнивает строки: сравнивает в памяти байты или слова

CMPS [SI], [DI]

SCAS

Сканирует строки: сравнивает регистры AL или AX с содержимым памяти, изменяя регистр флагов

SCAS [DI], AL

SCAS [DI], AX

STOS

Сохраняет строку данных: сохраняет содержимое регистров AL или AX в памяти

STOS [DI], AL

STOS [DI], AX

LODS

Загружает аккумулятор из строки: загружает байт или слово в AL или AX из памяти

LODS AL, [SI]

LODS AX, [SI]

Операнд-отправитель размещается по адресу, указанному в регистрах DS:SI. Адрес операнда-получателя указан в регистрах ES:DI. В регистрах DS и ES необходимо указать начало сегмента данных до того, как будут использоваться команды работы со строками.

Пример:

MOV AX, DATA ; установить адрес сегмента данных

MOV DS, AX ; инициализировать DS

MOV ES, AX ; инициализировать ES

Команда

Размер

Описание

Шаг инкрементации для SI и DI

MOVS

MOVSB

Перемещает (копирует) байт

1

MOVSW

Перемещает (копирует) слово

2

CMPS

CMPSB

Сравнивает байты

1

CMPSW

Сравнивает слова

2

SCAS

SCASB

Сканирует байт

1

SCASW

Сканирует слово

2

STOS

STOSB

Сохраняет байт

1

STOSW

Сохраняет слово

2

LODS

LODSB

Загружает байт

1

LODSW

Загружает слово

2

В регистрах SI и DI должны быть установлены смещения операндов.

Пример:

MOV SI, offset source ; SI указывает на отправителя

MOV DI, offset dest ; DI указывает на получателя

MOVSB ; копирует отправитель в получатель

(Оператор OFFSET возвращает смещение метки или переменной от начала сегмента).

Использование префикса повторения

REP ; повторять, пока СХ>0

REPZ, REPE ; повторять, пока флаг нуля установлен и СХ>0

REPNZ, REPNE ; повторять, пока флаг нуля сброшен и СХ>0

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

Число повторений должно быть записано в регистр CX до выполнения этой пары команд.

Для выхода из цикла в этом случае есть две причины: либо строки просмотрены полностью и все их элементы оказались равными (CX=0 и ZF=1), либо нашлась пара неравных элементов (ZF=0, CX - любое). По какой причине произошел выход, надо устанавливать после выхода из цикла.

Флаг направления DF

Значение флага

Действие на SI или DI

Направление

0

Инкрементируется

Снизу вверх

1

Декрементируется

Сверху вниз

Значение флага направления задает автор программы.

Флаг направления изменяется командами CLD и STD.

CLD ; сбросить флаг направления, направление – вверх

STD ; установить флаг направления, направление вниз

Команда MOVS (Пересылка строки)

Команда MOVSB пересылает байт, а команда MOVSW – слово, абсолютный адрес которого задается парой регистров DS:SI, в ячейку, абсолютный адрес которой задается парой ES:DI, после чего значения регистров SI и DI автоматически меняются.

[DS:SI]=>[ES:DI] ; SI:=SI+d; DI:=DI+d, где величина d определяется согласно состоянию флага DF (флаг направления).

Выход из цикла пересылки всей строки из одного места памяти в другое возможен тогда, когда будут переписаны все элементы строки. Для этого перед командой MOVS указывается префикс с названием REP.

REP MOVSB ; повторять пересылку байтов CX раз

Пример: содержимое массива Y переписать в массив X

CLD

LEA SI, Y ; ОТКУДА

PUSH DS

POP ES ; УСТАНОВКА ES НА СЕГМЕНТ ДАНЫХ

LEA DI, X ; КУДА

MOV CX, 100 ; СКОЛЬКО БАЙТ ПЕРЕПИСАТЬ

REP MOVSB

Команды сравнения строк

CMPSB – сравнение строк из байтов

CMPSW – сравнение строк из слов

[DS:SI]=[ES:DI] ? ; SI:=SI+d; DI:=DI+d

Команды сравнивают пару элементов – элемент из одной строки с элементом из другой строки. Абсолютный адрес элемента из первой строки должен задаваться регистрами DS и SI, а абсолютный адрес элемента из второй строки – регистрами ES и DI.

После выполнения данных команд меняются значения регистров SI и DI. В них записываются адреса соседних элементов строк. При DF=0 значения регистров увеличиваются, то есть происходит переход вперед. При DF=1 значения регистров уменьшаются, происходит переход назад.

Пример:

Пусть строка S1 из N байтов расположена в сегменте памяти, на начало которого установлен сегментный регистр DS, а строка S2 из того же числа байтов находится в сегменте, на начало которого установлен регистр ES. Проверить равенство строк.

Просмотр вперед для проверки равенства строк:

CLD ; DF=0

LEA SI, S1 ; DS:SI=начало S1

LEA DI, S2 ; ES:DI=начало S2

MOV CX, N ; длина строк

L: CMPSB ; сравнить пару элементов

JNE NOEQ ; S1<> S2 переход на NOEQ

LOOP L ; к следующей паре

EQ: … ; S1= S2

CLD ; DF=0

LEA SI, S1 ; DS:SI=начало S1

LEA DI, S2 ; ES:DI=начало S2

MOV CX, N ; длина строк

REPE CMPSB ; сравнить пока элементы равны (пока ZF=1)

JE EQ ; ZF=1 (S1=S2) переход на EQ

NOEQ: … ; ZF=0 (S1<> S2)

REPNE CMPSB

ПП заставляет повторять сравнение элементов строк, пока они не равны. Как только будет найдена пара равных элементов, цикл прекращается.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]