Методом, или способом адресации называют процедуру нахождения операнда. Способ адресации определяется комбинациями регистров общего назначения, индексных и базовых регистров, а также символических имен, и констант, с помощью которых в команде задается адрес для доступа к данным.
Все методы адресации данных можно отнести к одному из трех типов:
ü адресация к непосредственным данным;
ü адресация к данным в регистрах;
ü адресация к данным в памяти.
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’