Способы обращения к памяти ЭВМ
Режимы адресации данных:
1. Регистровая адресация.
2. Непосредственная адресация.
3. Прямая адресация.
4. Косвенная регистровая адресация.
5. Адресация по базе.
6. Прямая адресация с индексированием.
7. Адресация по базе с индексированием.
Микропроцессор выбирает один из семи режимов адресации по значению поля режима команды. Ассемблер присваивает то или иное значение полю режима в зависимости от того, какой вид имеют операнды в исходной программе. Например, если вы написали MOV АХ,ВХ то Ассемблер закодирует оба операнда (АХ и ВХ) для регистровой адресации. Однако если Вы заключили операнд-источник в квадратные скобки:
MOV AХ,[ВХ] то Ассемблер закодирует операнд-источник для косвенной регистровой адресации.
В табл. 1 приведены форматы операндов языка ассемблера для всех семи режимов адресации, реализуемых микропроцессором 8x86, и для каждого формата указано, какой из регистров сегмента используется для вычисления физического адреса. Обратите внимание, что во всех режимах предполагается доступ к сегменту данных (т. е. регистром сегмента служит регистр DS), и только в тех случаях, когда используется регистр ВР, предполагается доступ к сегменту стека (т. е. регистром сегмента служит регистр SS).
Важное замечание: при исполнении команд микропроцессора 8x86, манипулирующих строками, предполагается, что регистр DI указывает на ячейку дополнительного сегмента, а не сегмента данных. Таким образом, в качестве регистра сегмента эти команды используют регистр ES. Все другие команды исполняются по правилам, описанным в табл.1.
Таблица 1. Режимы адресации микропроцессора 8x86
Режим адресации | Формат операнда | Регистр сегмента |
Регистровый | регистр | Не используется |
Непосредственный | данное | Не используется |
Прямой | сдвиг метка | DS DS |
Косвенный регистровый | [ВХ] [ВР] [DI] [SI] | DS SS DS DS |
По базе | [ВХ] + сдвиг [ВР] + сдвиг | DS CS |
Прямой с индексированием | [DI] + сдвиг [SS] + сдвиг | DS DS |
По базе с индексированием | [BX][SI] + сдвиг [ВХ] [DI] + сдвиг [ВР] |S1] + сдвиг [ВР] [DI] + сдвиг | DS DS SS SS |
Примечания к таблице:
1. Компонентсдвиг при адресации по базе с индексированием необязателен.
2. Операндрегистр может быть любым 8-ми 16-и битовым регистром, кроме регистра IP.
3. Операндданное может быть 8- или 16-битовым значением константы.
4. Компонентсдвиг может быть 8- или 16-битовым значением смещения со знаком.
Регистровая и непосредственная адресация
При регистровой адресации микропроцессор 8x86 извлекает операнд из регистра (или загружает его в регистр). Например, команда MOV AХ,СХ копирует 16-битовое содержимое регистра счетчика СХ в аккумулятор АХ. Содержимое регистра СХ не изменяется. В данном примере микропроцессор 8x86 использует регистровую адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ.
Непосредственная адресация позволяет Вам указывать 8- или 16-битовое значение константы в качестве операнда-источника. Эта константа содержится в команде (куда она помещается Ассемблером), а не в регистре или в ячейке памяти. Например, команда MOV СХ,500 загружает значение 500 в регистр СХ, а команда MOV CL,-30 загружает значение - 30 в регистр CL.
Чтобы избежать трудностей, помните, что допустимые значения для 8-битовых чисел со знаком ограничены диапазоном от -128 (80Н) до 127 (7FH), а допустимые значения 16-битовых чисел со знаком — диапазоном от —32768 (8000Н) до 32767 (7FFFH). Максимальные значения 8-битовых чисел без знака равны соответственно 255 (OFFH) и 65535 (OFFFFH).
Прямая адресация
При прямой адресации исполнительный адрес является составной частью команды (так же, как значения при непосредственной адресации). Микропроцессор 8x86 добавляет этот исполнительный адрес к сдвинутому содержимому регистра сегмента данных DS и получает 20-битовый физический адрес операнда.
Обычно прямая адресация применяется, если операндом служит метка. Например, команда
MOV AX,TABLE
загружает содержимое ячейки памяти TABLE в регистр АХ. На рис. 1 показана схема исполнения этой команды. Обратите внимание на то, что против ожидания микропроцессор 8x86 заполняет данные в памяти в обратном порядке. Старший байт слова следует за младшим байтом, а не предшествует ему. Чтобы усвоить это, запомните, что старшая часть (старшие биты) данных располагается в ячейках памяти со старшими адресами.