Методы адресации данных

Методом, или способом адресации называют процедуру нахождения операнда. Способ адресации определяется комбинациями регистров общего назначения, индексных и базовых регистров, а также символических имен, и констант, с помощью которых в команде задается адрес для доступа к данным.

Все методы адресации данных можно отнести к одному из трех типов:

ü адресация к непосредственным данным;

ü адресация к данным в регистрах;

ü адресация к данным в памяти.

3.1.2. Непосредственная адресация. Операнд располагается в самой команде и может иметь любой смысл: константа (число), выражение, адрес, код ASCII, или в виде символического обозначения. Возможна пересылка относительных адресов (смещений). Для указания относительного адреса данной ячейки используется описатель OFFSET.

Examle 3.1.Фрагмент программы с непосредственной адресацией.

; сегмент данных

mes DB ‘Привет’ ; строка символов

X EQU 12;

; фрагмент кода программы

MOV AH, 40h ; число 40h загружается в AH

MOV AL, ‘*’ ; код символа * загружается в AL

MOV CX, X ; число, обозначенное как X загружается в CX, CX=12

MOV AX, (40*2) ; значение выражения 40*2 загружается в AX

INT 21h ; команда прерывания типа 21h

; использования директивы OFFSET

MOV DX, OFFSET mes ; адрес начало строки загружается в DX

3.2.1. Регистровая адресация. Операнд(ы) располагаются в одном из регистров общего назначения либо в сегментном регистре.

Examle 3.2.Фрагмент программы с регистровой адресацией.

INC CX ; увеличить на 1 содержимое регистра CX

MOV CX, BX ; переслать содержимое регистра BX в CX

PUSH DS ; поместить содержимое регистра DS в стек

3.2.2. Адресация памяти.Чтобы облегчить управление массивами и сложными структурами данных в системе команд Intel 8086 используется много способов представления операндов памяти.

Прямая адресация. Адрес ячейки памяти указывается в команде. Прямой адрес может определятся относительно любого из четырех доступных сегментов. По умолчанию адреса памяти (смещение) вычисляется относительно DS. Прямая адресация может быть со смещением.

Регистрово-косвенная адресация: базовая и индексная.

При базовой адресации относительный адрес операнда находится в регистрах BX или BP, а при индексной - в регистрах SI или DI. При использовании регистров BX, SI и DI подразумевается сегмент, адресуемый через DS, при использовании регистра BP - подразумевается сегмент, адресуемый через SS. Допускается замена сегмента. Операнд указывается в квадратных скобках, например, [BX]. Это означает, что при обращение к регистру BX его содержимое расценивается как адрес, а не как значение.

Регистрово-косвенная со смещением: базовая и индексная. Относительный адрес операнда определяется как сумма содержимого регистра BX, BP, SI или DI и указанной в команде константы, называемой смещением. Допускается переопределение базового сегмента [].

Допустимы обозначения вида: [BX]+смещение или [BX + смещение]. Нельзя комбинировать два базовых или два индексных регистра.

Базово-индексная адресация. Относительный адрес операнда определяется как сумма содержимого следующих пар: [BX][SI] (по регистру DS), [BX][DI] (по регистру DS), [BP][SI] (по регистру SS), [BP][DI] (по регистру SS). Допускается переопределение сегментного регистра.

Базово-индексная адресация со смещением. Относительный адрес операнда определяется как сумма содержимого двух регистров и смещения: [BX][SI] (по регистру DS), [BX][DI] (по регистру DS), [BP][SI] (по регистру SS), [BP][DI] (по регистру SS). Допускается переопределение сегментного регистра и обозначения вида: смещение [BX + SI], [смещение + BX + SI] и [BX][SI] + смещение.

Examle 3.3.Фрагмент программы использования адресации памяти.

; сегмент данных

val DB 10h, 20h

val16 DW 1000h, 2000h

mes DB ‘Hello’

; сегмент кода

; Прямая адресация памяти

INC val ; содержимое по указателю val увеличивается на 1

MOV DX, val16 ; DX = 1000h

MOV DL, val ; DL = 10h

MOV DH, val+1 ; DH = 20h, прямая адресация со смещением

MOV AX, val16 ; AX = 1000h

MOV BX, val16 + 2 ; DH = 2000h, прямая адресация со смещением

MOV AL, DS:6h ; AL = 20h, прямая, абсолютная адресация

;регистрово-косвенная адресации памяти.

MOV BX, OFFSET val ; В BX содержится смещение переменной val

MOV SI, OFFSET mes ; В SI содержится смещение переменной mes

MOV AL, [BX] ; AL = 10h

INC BX ; получить адрес следующей ячейки памяти

MOV AH, [BX] ; AL = 20h

MOV DI, [SI] ; DI = ‘H’

INC SI ; получить адрес следующей ячейки памяти

INC DI ; получить адрес следующей ячейки памяти

MOV DI, [SI] ; DI = ‘e’

; регистрово-базовая, косвенная со смещением

MOV AL, [BX+1] ; AL = 20h

MOV AH, [BX+2] ; AH = 30h

; базовый индексная со смещением

INC BX ; получить адрес следующей ячейки памяти

MOV AH, [BX] ; AL = 20h

MOV DI, [SI] ; DI = ‘H’

INC SI ; получить адрес следующей ячейки памяти

INC DI ; получить адрес следующей ячейки памяти

MOV DI, [SI] ; DI = ‘e’