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