Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Ассемблеру.docx
Скачиваний:
12
Добавлен:
09.11.2018
Размер:
125.1 Кб
Скачать

Адресация no базе

Базовый регистр BX (или ВР) содержит базу (адрес начала некоторого фрагмента памяти), относительно которой ассемблер вычисляет смещение, например:

mov ах,[Ьх]+10 {Загружаем в АХ 10-й по счету байт от начала базы памяти по адресу DS:BX);

Регистры

Поле операнда

в команде Операнд

Оп

Опер. память

Индексная адресация

Индексная адресация часто применяется для обработки двумерных массивов. Смещение операнда вычисляется процессором как сумма содержимого базового и индексного регистра. При этом базовыми являются регистры BX, BP, а индексными SI, DI. Применение других регистров недопустимо. Примеры такой адресации: [BX][SI], [BP][DI].

Индексная адресация с базовым регистром BX обращается в сегмент данных, а с BP – в стек. Возможна замена сегмента, она выполняется аналогично косвенной адресации.

Рассмотрим методику работы с двумерным массивом. В BX (или BP) заносится адрес начала строки массива, а в SI (DI) – смещение операнда внутри строки.

Общий вид: {<сегмент>:}[<Баз. рег>][<Инд. регистр>].

Регистры

Поле операнда

в команде Операнд

Опер. память

Один из индексных регистров SI или DI указывает положение элемента относительно начала некоторой области памяти. Пусть, например, АОВ - имя массива значений типа Byte. Тогда можно использовать такие фрагменты:

mov si,15 {Помещаем в SI константу 15}

mov ah,AОB[si] {Пересылаем в АН 16-й по порядку байт от начала массива}

mov si,0

mov AOB[si],ah {Пересылаем полученное в самый первый элемент массива}

Индексная адресация со смещением

Эта адресация более удобна для обработки двумерных массивов. К смещению, полученному с помощью индексной адресации, добавляется дополнительное смещение. По аналогии с косвенной адресацией со смещением, ее можно записать как {<сегмент>:}[<Баз. рег>][<Инд. регистр> + <смещение>].

Например:

mov ax,[bx][si]

Регистры

Поле операнда

в команде Операнд

Операнд

Опер. память

Если, например, АОВ есть массив из 10x10 байт вида

var

АОВ: array [ 0..9,0..9] of Byte;

то для доступа к элементу АОВ [2,3] можно использовать такой фрагмент

mov bx,20 {База строки 2}

mov si,2 {Номер 3-го элемента}

mov ax,AOB[bxj [si] {Доступ к элементу}