1. Неявная адресация
При этой адресации в команде нет спец полей для определения операнда. Операнд задается самой командой. В таких командах отсутствуют поля для записи и хранения операндов.
Напр.: aaa – аски коррекция после сложения
Std, Cmc – компилируют флагами
2. Регистровая адресация
Этот вид адресации предполагает передачу данных из одного регистра в другой. Команда с этим режимом адресации операндов находится во внутреннем регистре процессора. При этом они не все регистры могут быть указаны в команде.
Напр.:
mov AX, BX; копируются данные из BX в AX
mov DS, AX; сегментный регистр DS инициализируется числом из AX
xchg AL, AH; обмен значений регистров AL и AH
3. Непосредственная адресация
При этом виде адресации происходит загрузка в регистр константы непосредственно записанной в команде. С точки зрения программирования говорят что операнд задается своим изображением.
Напр.: mov ax, 0AF1h – изображение
; загрузка адресов в индексные регистры:
lea SI, X
lea DI, Y
4. Адресация операндов памяти
При нахождении операндов в ОП становится вопрос о вычислении адреса смещения операндов. При этом предполагается что адрес смещения определяет № байта с которого начинается операнд относительно сегмента в котором он находится. В большинстве команд предполагается по умолчанию операнд вводится в сегменте адресуемый сегментным регистром ds. Однако при помощи префикса замены сегмента можно указать любой др. сегментный регистр.
Адресация операндов памяти делится на:
1. Прямая (абсолютная)
место нахождения в памяти операнда задается непосредственно в команде адресом смещения. Здесь предполагается передача данных из ячейки памяти в другую ячейку памяти, или из ячейки памяти в регистр, или из регистра в ячейку памяти.
напр.: mov ax, [ 0AF1h ]
2. Косвенная
Этот вид адресации предполагает использование базового регистра BX, используемого в качестве указателя. Это одна из разновидностей базовой адресации.
напр.: mov ax, [bx]
3. по базе со смещением
это разновидность косвенной адресации. Ээффективный адрес вычисляется как сумма адреса находящегося в базовом регистре и const значения. В качестве bx может использоваться люб регистр общего назначения. Если в качестве базового регистра используется bp то по умножению считается что эффективный адрес операнда находится в стеке.
напр.: mov ax, [ bx+4 ]
4. индексная
реализуется аналогично базовой, при этом регистр используется для указания индекса данных относительно некоторой метки.
напр.: mov ax, array [ SI ] – здесь к смещению определяющему метку array + смещение кот находится в SI.
Также индексная адресация может быть со смещением. Для этого значение индексного регистра прибавляется к смещению. (не важно bx или si - базовый)
5. по базе с индексирование
аналогична индексной адресации. Вместо метки определяющей местоположения в памяти операнда используется базовый регистр.
Маштабирование – умножение индексного регистра на 2, 4, 8. напр.: mov ax, [bx] [si*4]
6. стековая
Стековая адресация предназначена для передачи данных из стека и в стек. Для этого предназначены команды push и pop, адресующие ячейки памяти посредством регистра SP(вершина стека), и команды mov, использующие регистр BP.
Состав и назначение дескриптора сегмента памяти
Каждый сегмент в защищенном режиме должен иметь соответствующую ему структуру данных наз. дескриптором. Дескриптор (describe - описать) содержит основные характеристики соответствующего ему сегмента памяти. Каждый дескриптор состоит из 8байт (т.е. 64 разряда).
Формат дескриптора:
63 | 47 | 32 | |||||
БА | G | D | X | U | Предел | AR | БА |
31 | 15 | 0 | |||||
БА | предел |
Предел – 20бит отводится для хранения max размера сегмента.
БА (базовый адрес) – 32 бита (2,3,4,7 байты) хранят базовый адрес соответствующего сегмента – линейный БА.
G - бит градуальности, определяет единицу счета этого предела (при 0 – байты; при 1- страницы (4Кб))
D – введен для совместимости режима работы 80286 процессора. (при 0 - = 32 бита; при 1 - = 16 бит)
X – резервный бит
U – user пользовательский бит
AR – байт прав доступа, определяет права сегмента и его назначение.