Доклад на тему режимы адресации

Обновлено: 17.05.2024

Заметки для изучения базового языка ассемблера (3) - режим адресации

Заметки для изучения базового языка ассемблера (3) - режим адресации

Адресация данных

Инструкция состоит из двух частей: кода операции и операнда. В коде операции используется мнемоника для обозначения операции, которую должен выполнить процессор; операнд является участником выполнения инструкции и должен указываться адресом.
Доступ к данным или инструкциям осуществляется через адреса.
Режим адресации: метод поиска действительного адреса.

  1. Адресация данных: Найдите адрес операнда, необходимый для доступа во время выполнения инструкции;
    ① Данные хранятся в коде инструкции: немедленная адресация, выраженная константами.
    ② Операнд исходит из регистра: адресация регистра, выраженная именем регистра.
    ③ Данные поступают из основной памяти: адресация памяти, представленная адресом памяти.
    Адресация памяти делится на три категории: прямая адресация; регистровая косвенная адресация; регистровая относительная адресация.
    ④ Операнд происходит от периферийного устройства (интерфейса): периферийное устройство I / / / Адрес O, используйте I / / / O адрес представителя.
    Периферийное устройство I / / / Адресация O делится на две категории: прямая адресация; косвенная адресация.
  2. Адресация инструкций: после выполнения инструкции определяется место следующей инструкции, которая должна быть выполнена.

Немедленное обращение

Данные были сохранены в коде инструкции.

Операнды следуют за кодом операции и являются частью машинного кода, называемого Immediate.

Непосредственная форма:
① Шестнадцатеричная константа;
② Символы (значение кода ASCII);
③ Отрицательное десятичное число (дополнительный код);
④ Символьная константа;
⑤ Постоянное выражение;
⑥ Адрес смещения переменной (имя переменной смещения);
⑦ Адрес смещения метки (метка оператора: сегмент кода использует имя метки для представления своего адреса смещения).

Тип немедленных данных: определяется типом соответствующего регистра или переменной и не имеет типа.

Режим немедленной адресации используется только для исходных операндов.Он обычно используется для присвоения значений регистрам и единицам хранения и прямого выражения в постоянной форме.

Непосредственное представление символа: i8, i16, i32, imm.

Данные поступают из регистров внутри ЦП.

Операнд хранится во внутреннем регистре процессора, и его содержимое представлено именем регистра.

32-битные регистры общего назначения: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP

16-битные регистры общего назначения: AX, BX, CX, DX, SI, DI, BP, SP

Целевой операнд и тип исходного операнда должны совпадать, то есть типы двух операндов должны быть одинаковыми в операторе.

Обозначение регистров: r8, r16, r32, reg.

Адресация памяти

Данные поступают из основной памяти.

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

Эффективный адрес имеет только часть смещения, которая непосредственно включена в код инструкции, а адрес смещения представлен именем переменной (или квадратными скобками).

Сегмент кода памяти хранит адрес смещения операнда в сегменте данных, а сегмент данных памяти хранит данные.

На операнды основной памяти часто ссылаются в виде переменных, и, как правило, нет необходимости использовать сегмент за префиксной инструкцией.

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

Косвенная адресация регистров памяти

Действующий адрес - это только часть базового регистра. Действующий адрес хранится в регистре, содержимое регистра = адрес смещения = эффективный адрес, что выражается заключением регистра в квадратные скобки.

Косвенная адресация регистров не определяет тип данных. Данные определяются регистром или типом переменной другого операнда. Если инструкция имеет только один операнд, необходимо указать тип (PTR).
Сложение и вычитание адреса основано на байтовой единице основной памяти.

Удобно оперировать символами элемента массива или строки: регистру присваивается первый (конечный) адрес массива (строки), а значение регистра можно увеличивать или уменьшать, чтобы указывать на разные элементы (символы).

Относительная адресация памяти

Действующий адрес - это сумма содержимого регистра и смещения Регистр должен быть заключен в квадратные скобки.

  1. Относительная адресация регистров не определяет тип данных. Данные определяются регистром или типом переменной другого операнда. Когда инструкция имеет только один операнд, необходимо указать тип (PTR).
    Сложение и вычитание адреса основано на байтовой единице основной памяти.
  2. Удобно работать с символами элементов массива или строк: первый адрес массива (строки) используется в качестве смещения, регистру присваивается 0 или количество элементов (символов), а значение регистра увеличивается или уменьшается, чтобы указывать на разные элементы (символы).

Обращение к инструкции

Адресация инструкций: ① последовательная адресация; ② переходная адресация (относительная адресация, прямая адресация, косвенная адресация (косвенная адресация регистров, косвенная адресация памяти));

Последовательная адресация

Автоинкремент EIP указывает на следующую инструкцию и последовательно выполняет следующую инструкцию.

Перейти к адресации

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

Относительная адресация инструкций

Обеспечивает смещение целевого адреса относительно текущего указателя инструкции EIP (форма инструкции: смещение кода операции).
Целевой адрес (адрес назначения или адрес передачи) = текущий EIP + смещение.
Относительная адресация - это передача внутри сегмента, наиболее часто используемая и наиболее гибкая.

Прямая адресация инструкций

Укажите целевой адрес напрямую (форма инструкции: целевой адрес кода операции).
Целевой адрес = операнд инструкции.
теоретически может поддерживать внутрисегментную или межсегментную передачу, IA-32 поддерживает только прямую передачу между сегментами.

Косвенная адресация инструкций

Укажите регистр или блок хранения, целевой адрес исходит из регистра или блока хранения и получается косвенно.
① Регистр косвенной адресации: используйте регистр для сохранения целевого адреса (форма инструкции: адрес регистра кода операции).
② Косвенная адресация памяти: сохраните целевой адрес с блоком памяти (форма инструкции: адрес памяти кода операции).

Режимы адресации — это различные способы указания местоположения операндов. До этой части в учебном курсе использовались только простые режимы адресации: операнды чаще всего находились в регистрах или в переменных в памяти. Но в процессоре Intel 8086 существуют также более сложные режимы, которые позволяют организовать работу с массивами, структурами, локальными переменными и указателями. В этой части я расскажу о всех возможных режимах адресации и приведу примеры их использования.

1. Неявная адресация

Местоположение операнда фиксировано и определяется кодом операции. Примеры:

Команда CBW всегда работает с регистрами AX и AL, а у команды MUL фиксировано положение первого множителя и результата. Такой режим адресации делает машинную команду короткой, так как в ней отсутствует указание одного или нескольких операндов.

2. Непосредственная адресация

При непосредственной адресации значение операнда является частью машинной команды. Понятно, что в этом случае операнд представляет собой константу. Примеры:

mov al,5 add bx,1234h mov dx,a

Обратите внимание, что в третьей строке в DX помещается адрес метки или переменной a, а вовсе не значение по этому адресу. Это особенность синтаксиса FASM. По сути адрес метки тоже является числовой константой.

3. Абсолютная прямая адресация

В машинной команде содержится адрес операнда, находящегося в памяти. Пример:

Вот тут уже в DX помещается значение из памяти по адресу a. Сравните с предыдущим пунктом. Квадратные скобки обозначают обращение по адресу, указанному внутри этих скобок.

4. Относительная прямая адресация

Этот режим используется в командах передачи управления. В машинной команде содержится смещение, которое прибавляется к значению указателя команд IP. То есть указывается не сам адрес перехода, а на сколько байтов вперёд или назад надо перейти. Пример:

metka: . loop metka

У такого режима адресации два преимущества. Во-первых, машинная команда становится короче, так она содержит не полный адрес, а только смещение. Во-вторых, такой код не зависит от адреса, по которому он размещается в памяти.

5. Регистровая адресация

Операнд находится в регистре. Пример:

6. Косвенная регистровая (базовая) адресация

Адрес операнда находится в одном из регистров BX, SI или DI. Примеры:

add ax,[bx] mov dl,[si]

7. Косвенная регистровая (базовая) адресация со смещением

add ax,[bx+2] mov dx,[array1+si]

В качестве смещения можно указать число или адрес метки. О размере смещения не беспокойтесь — компилятор сам его определяет и использует нужный формат машинной команды.

8. Косвенная базовая индексная адресация

Адрес операнда вычисляется как сумма содержимого одного из базовых регистров BX или BP и одного из индексных регистров SI или DI. Примеры:

mov ax,[bp+si] add ax,[bx+di]

Например, в одном из регистров может находиться адрес начала массива в памяти, а в другом — смещение какого-то элемента относительно начала. А вообще, всё зависит от вашей фантазии 🙂

9. Косвенная базовая индексная адресация со смещением

mov al,[bp+di+5] mov bl,[array2+bx+si]

Пример программы

Допустим, имеется массив 32-битных целых чисел со знаком. Количество элементов массива хранится в 16-битной переменной без знака. Требуется вычислить среднее арифметическое элементов массива и сохранить его в 32-битной переменной со знаком. Я намеренно использовал разные режимы адресации, хотя тоже самое можно написать проще.

use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h sub ax,ax ;AX = 0 cwd ;DX = 0 mov si,ax ;SI = 0 - смещение элемента от начала массива mov bx,array ;Помещаем в BX адрес начала массива mov di,n ;Помещаем в DI адрес n mov cx,[di] ;CX = n lp1: add ax,[bx+si] ;Прибавление младшего слова adc dx,[bx+si+2] ;Прибавление старшего слова add si,4 ;Увеличиваем смещение в SI на 4 loop lp1 ;Команда цикла idiv word[di] ;Делим сумму на количество элемнтов cwd ;DX:AX = AX mov word[m],ax ;\ Сохраняем mov word[m+2],dx ;/ результат mov ax,4C00h ;\ int 21h ;/ Завершение программы ;------------------------------------------------------- n dw 10 array dd 10500,-7500,-15000,10000,-8000 dd 6500,11500,-5000,10500,-20000 m dd ?

Упражнение

2.1. Процессор.

Самый основной элемент компьютера, это, конечно, процессор. Давайте подробней его рассмотрим. Упрощённая структура процессора (рис. 4):


Рис. 4. Упрощённая структура процессора

Основные элементы процессора:

· Регистры – это специальные ячейки памяти, физически расположенные внутри процессора. В отличие от ОЗУ, где для обращения к данным требуется использовать шину адреса, к регистрам процессор может обращаться напрямую. Это существенно ускорят работу с данными.

· Арифметико-логическое устройство выполняет арифметические операции, такие как сложение, вычитание, а также логические операции.

· Блок управления определяет последовательность микрокоманд, выполняемых при обработке машинных кодов (команд).

· Тактовый генератор , или генератор тактовых импульсов, задаёт рабочую частоту процессора.

2.2. Режимы работы процессора.

Процессор архитектуры x86 может работать в одном из пяти режимов и переключаться между ними очень быстро:

1. Реальный (незащищенный) режим (real address mode) — режим, в котором работал процессор 8086. В современных процессорах этот режим поддерживается в основном для совместимости с древним программным обеспечением (DOS-программами).

2. Защищенный режим (protected mode) — режим, который впервые был реализован в 80286 процессоре. Все современные операционные системы (Windows, Linux и пр.) работают в защищенном режиме. Программы реального режима не могут функционировать в защищенном режиме.

3. Режим виртуального процессора 8086 (virtual-8086 mode, V86) — в этот режим можно перейти только из защищенного режима. Служит для обеспечения функционирования программ реального режима, причем дает возможность одновременной работы нескольких таких программ, что в реальном режиме невозможно. Режим V86 предоставляет аппаратные средства для формирования виртуальной машины, эмулирующей процессор8086. Виртуальная машина формируется программными средствами операционной системы. В Windows такая виртуальная машина называется VDM (Virtual DOS Machine — виртуальная машина DOS). VDM перехватывает и обрабатывает системные вызовы от работающих DOS-приложений.

4. Нереальный режим (unreal mode, он же big real mode) — аналогичен реальному режиму, только позволяет получать доступ ко всей физической памяти, что невозможно в реальном режиме.

5. Режим системного управления System Management Mode (SMM) используется в служебных и отладочных целях.

При загрузке компьютера процессор всегда находится в реальном режиме, в этом режиме работали первые операционные системы, например MS-DOS, однако современные операционные системы, такие как Windows и Linux переводят процессор в защищенный режим. Вам, наверное, интересно, что защищает процессор в защищенном режиме? В защищенном режиме процессор защищает выполняемые программы в памяти от взаимного влияния (умышленно или по ошибке) друг на друга, что легко может произойти в реальном режиме. Поэтому защищенный режим и назвали защищенным.

2.3. Регистры процессора (программная модель процессора).

Для понимания работы команд ассемблера необходимо четко представлять, как выполняется адресация данных, какие регистры процессора и как могут использоваться при выполнении инструкций. Рассмотрим базовую программную модель процессоров Intel 80386, в которую входят:

· 8 регистров общего назначения, служащих для хранения данных и указателей;

· регистры сегментов — они хранят 6 селекторов сегментов;

· регистр управления и контроля EFLAGS, который позволяет управлять состоянием выполнения программы и состоянием (на уровне приложения) процессора;

· регистр-указатель EIP выполняемой следующей инструкции процессора;

· система команд (инструкций) процессора;

· режимы адресации данных в командах процессора.

Начнем с описания базовых регистров процессора Intel 80386.

Базовые регистры процессора Intel 80386 являются основой для разработки программ и позволяют решать основные задачи по обработке данных. Все они показаны на рис. 5.


Рис. 5. Базовые регистры процессора Intel 80386

Среди базового набора регистров выделим отдельные группы и рассмотрим их назначение.

2.4. Регистры общего назначения.

Остальные четыре регистра – ESI (индекс источника), EDI (индекс приемника), ЕВР (указатель базы), ESP (указатель стека) – имеют более конкретное назначение и применяются для хранения всевозможных временных переменных. Регистры ESI и EDI необходимы в строковых операциях, ЕВР и ESP – при работе со стеком. Так же как и в случае с регистрами ЕАХ - EDX, младшие половины этих четырех регистров называются SI, DI, BP и SP соответственно, и в процессорах до 80386 только они и присутствовали.

2.5. Сегментные регистры.

При использовании сегментированных моделей памяти для формирования любого адреса нужны два числа – адрес начала сегмента и смещение искомого байта относительно этого начала (в бессегментной модели памяти flat адреса начал всех сегментов равны). Операционные системы (кроме DOS) могут размещать сегменты, с которыми работает программа пользователя, в разных местах памяти и даже временно записывать их на диск, если памяти не хватает. Так как сегменты способны оказаться где угодно, программа обращается к ним, применяя вместо настоящего адреса начала сегмента 16-битное число, называемое селектором. В процессорах Intel предусмотрено шесть 16-битных регистров - CS, DS, ES, FS, GS, SS , где хранятся селекторы. (Регистры FS и GS отсутствовали в 8086, но появились уже в 80286.) Это означает, что в любой момент можно изменить параметры, записанные в этих регистрах.

В отличие от DS, ES, GS, FS, которые называются регистрами сегментов данных, CS и SS отвечают за сегменты двух особенных типов – сегмент кода и сегмент стека. Первый содержит программу, исполняющуюся в данный момент, следовательно, запись нового селектора в этот регистр приводит к тому, что далее будет исполнена не следующая по тексту программы команда, а команда из кода, находящегося в другом сегменте, с тем же смещением. Смещение очередной выполняемой команды всегда хранится в специальном регистре EIP (указатель инструкции, 16-битная форма IP), запись в который так же приведет к тому, что далее будет исполнена какая-нибудь другая команда. На самом деле все команды передачи управления – перехода, условного перехода, цикла, вызова подпрограммы и т.п. – и осуществляют эту самую запись в CS и EIP.

2.6. Регистр флагов.

Еще один важный регистр, использующийся при выполнении большинства команд, - регистр флагов. Как и раньше, его младшие 16 бит, представлявшие собой весь этот регистр до процессора 80386, называются FLAGS. В EFLAGS каждый бит является флагом, то есть устанавливается в 1 при определенных условиях или установка его в 1 изменяет поведение процессора. Все флаги, расположенные в старшем слове регистра, имеют отношение к управлению защищенным режимом, поэтому здесь рассмотрен только регистр FLAGS (см. рис. 6):


Рис. 6. Регистр флагов FLAGS.

CF – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), в противном случае – в 0. Например, после сложения слова 0 FFFFh и 1, если регистр, в который надо поместить результат, – слово, в него будет записано 0000 h и флаг CF = 1.

PF – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число битов, равных 1, и в 0, если нечетное. Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, когда он равен 1.

AF – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.

ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль.

SF – флаг знака. Он всегда равен старшему биту результата.

TF – флаг ловушки. Он был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой программной команды управление временно передается отладчику.

IF – флаг прерываний. Сброс этого флага в 0 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков кода.

DF – флаг направления. Он контролирует поведение команд обработки строк: когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, когда DF =0 – наоборот.

OF – флаг переполнения. Он устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное, и наоборот.

Флаги IOPL (уровень привилегий ввода-вывода) и NT (вложенная задача) применяются в защищенном режиме.

2.7. Цикл выполнения команды

Программа состоит из машинных команд. Программа загружается в оперативную память компьютера. Затем программа начинает выполняться, то есть процессор выполняет машинные команды в той последовательности, в какой они записаны в программе.

Для того чтобы процессор знал, какую команду нужно выполнять в определённый момент, существует счётчик команд – специальный регистр, в котором хранится адрес команды, которая должна быть выполнена после выполнения текущей команды. То есть при запуске программы в этом регистре хранится адрес первой команды. В процессорах Intel в качестве счётчика команд (его ещё называют указатель команды) используется регистр EIP (или IP в 16-разрядных программах).

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

Цикл выполнения команды – это последовательность действий, которая совершается процессором при выполнении одной машинной команды. При выполнении каждой машинной команды процессор должен выполнить как минимум три действия: выборку, декодирование и выполнение. Если в команде используется операнд, расположенный в оперативной памяти, то процессору придётся выполнить ещё две операции: выборку операнда из памяти и запись результата в память. Ниже описаны эти пять операций.

  • Выборка команды . Блок управления извлекает команду из памяти (из очереди команд), копирует её во внутреннюю память процессора и увеличивает значение счётчика команд на длину этой команды (разные команды могут иметь разный размер).
  • Декодирование команды . Блок управления определяет тип выполняемой команды, пересылает указанные в ней операнды в АЛУ и генерирует электрические сигналы управления АЛУ, которые соответствуют типу выполняемой операции.
  • Выборка операндов . Если в команде используется операнд, расположенный в оперативной памяти, то блок управления начинает операцию по его выборке из памяти.
  • Выполнение команды . АЛУ выполняет указанную в команде операцию, сохраняет полученный результат в заданном месте и обновляет состояние флагов, по значению которых программа может судить о результате выполнения команды.
  • Запись результата в память . Если результат выполнения команды должен быть сохранён в памяти, блок управления начинает операцию сохранения данных в памяти.

Суммируем полученные знания и составим цикл выполнения команды:

  1. Выбрать из очереди команд команду, на которую указывает счётчик команд.
  2. Определить адрес следующей команды в очереди команд и записать адрес следующей команды в счётчик команд.
  3. Декодировать команду.
  4. Если в команде есть операнды, находящиеся в памяти, то выбрать операнды.
  5. Выполнить команду и установить флаги.
  6. Записать результат в память (по необходимости).
  7. Начать выполнение следующей команды с п.1.

Это упрощённый цикл выполнения команды. К тому же действия могут отличаться в зависимости от процессора. Однако это даёт общее представление о том, как процессор выполняет одну машинную команду, а значит и программу в целом.

Аннотация: Рассматриваются режимы адресации 16-разрядного микропроцессора Intel-8086 и их связь с форматами команд, а также форматы и особенности реализации команд переходов.

Микропроцессор Intel-8086 (К1810ВМ80) имеет двухадресную систему команд [8,10]. Ее особенностью является отсутствие команд, использующих оба операнда из оперативной памяти. Исключение составляют лишь команды пересылки и сравнения цепочек байт или слов, которые в данном пособии рассматриваться не будут. Таким образом, в командах допустимы следующие сочетания операндов: RR , RS , RI , SI . Здесь R обозначает операнд , находящийся в одном из регистров регистровой памяти микропроцессора, S - операнд , находящийся в оперативной памяти, адрес которого формируется по одному из допустимых способов адресации , I - непосредственный операнд , закодированный в адресном поле самой команды. Формат команды во многом определяется способом адресации операнда, находящего в оперативной памяти, длиной используемого непосредственного операнда, а также наличием и длиной смещения, используемого при относительных режимах адресации.

Микропроцессор имеет все режимы адресации, общая схема которых была рассмотрена выше. Естественно, они имеют определенные особенности, присущие данному процессору.

Непосредственная адресация предполагает, что операнд занимает одно из полей команды и, следовательно, выбирается из оперативной памяти одновременно с ней. В зависимости от форматов обрабатываемых процессором данных непосредственный операнд может иметь длину 8 или 16 бит, что в дальнейшем будем обозначать data8 и data16 соответственно.

Адресация оперативной памяти имеет свои особенности, связанные с ее разбиением на сегменты и использованием сегментной группы регистров для указания начального адреса сегмента. 16-разрядный адрес, получаемый в блоке формирования адреса операнда на основе указанного режима адресации, называется эффективным адресом (ЭА). Иногда эффективный адрес обозначается как ЕА ( effective address ). 20-разрядный адрес, который получается сложением эффективного адреса и увеличенного в 16 раз значения соответствующего сегментного регистра , называется физическим адресом (ФА).

Именно физический адрес передается из микропроцессора по 20-ти адресным линиям, входящим в состав системной шины, в оперативную память и используется при обращении к ее ячейке на физическом уровне. При получении эффективного адреса могут использоваться все основные режимы адресации, рассмотренные выше, а также некоторые их комбинации.

Прямая адресация предполагает, что эффективный адрес является частью команды. Так как ЭА состоит из 16 разрядов, то и соответствующее поле команды должно иметь такую же длину.

При регистровой косвенной адресации эффективный адрес операнда находится в базовом регистре BX или одном из индексных регистров DI либо SI :

Обозначение имени регистра в квадратных скобках указывает на содержимое соответствующего регистра. Фигурные скобки - символ выбора одной из нескольких возможных альтернатив.

При регистровой относительной адресации эффективный адрес равен сумме содержимого базового или индексного регистра и смещения:

Эффективный адрес при базово-индексной адресации равен сумме содержимого базового и индексного регистров, определяемых командой:

Форматы двухоперандных команд представлены на рис.6.1. Пунктиром показаны поля, которые в зависимости от режима адресации могут отсутствовать в команде.

Поле КОП содержит код выполняемой операции . Признак w указывает на длину операндов. При w = 1 операция проводится над словами, а при w = 0 - над байтами. Признак d указывает положение приемника результата. Признак d = 1 , если результат записывается на место операнда, закодированного в поле reg , и d = 0 , если результат записывается по адресу, закодированному полями ( md , r/m ).

Второй байт команды, называемый постбайтом , определяет операнды, участвующие в операции. Поле reg указывает регистр регистровой памяти согласно табл. 6.1

Поля md и r/m задают режим адресации второго операнда согласно табл. 6.2.

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

  • Режим немедленной адресации
  • Режим прямой адресации
  • Зарегистрировать режим прямой адресации
  • Зарегистрировать режим косвенной адресации
  • Режим индексированной адресации

Режим немедленной адресации

Давайте начнем с примера.

В общем, мы можем написать,

Следующая иллюстрация описывает вышеупомянутую инструкцию и ее выполнение. Код операции 74H сохраняется по адресу 0202. Данные 6AH сохраняются по адресу 0203 в памяти программы. После считывания кода операции 74H данные по адресу следующей памяти программ передаются в аккумулятор A (E0H — это адрес аккумулятора). Поскольку команда состоит из 2 байтов и выполняется за один цикл, счетчик программ будет увеличен на 2 и будет указывать на 0204 памяти программы.

Режим немедленной адресации

Режим прямой адресации

Это еще один способ обращения к операнду. Здесь адрес данных (исходные данные) задается в качестве операнда. Давайте возьмем пример.

Банк регистров № 0 (4-й регистр) имеет адрес 04H. Когда инструкция MOV выполняется, данные, хранящиеся в регистре 04H, перемещаются в аккумулятор. Поскольку регистр 04H содержит данные 1FH, 1FH перемещается в аккумулятор.

Теперь взгляните на следующую иллюстрацию. Он показывает, как выполняется инструкция.

Режим прямой адресации

Как показано на рисунке выше, это 2-байтовая инструкция, для выполнения которой требуется 1 цикл. ПК будет увеличен на 2 и будет указывать на 0204. Код операции для инструкции MOV A, адрес E5H. Когда инструкция в 0202 выполнена (E5H), аккумулятор становится активным и готовым к приему данных. Затем ПК переходит к следующему адресу 0203 и ищет адрес местоположения 04H, где находятся исходные данные (для передачи в аккумулятор). В 04H система управления находит данные 1F и передает их в аккумулятор, и, следовательно, выполнение завершается.

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

За один раз регистры могут принимать значения от R0 до R7. Есть 32 таких регистра. Чтобы использовать 32 регистра с 8 переменными для адресации регистров, используются банки регистров. Существует 4 банка регистров с именами от 0 до 3. Каждый банк состоит из 8 регистров с именами от R0 до R7.

Код операции EC используется для MOV A, R4. Код операции сохраняется по адресу 0202, и когда он выполняется, управление переходит непосредственно к R4 уважаемого банка регистров (который выбран в PSW). Если выбран банк регистров № 0, то данные из R4 банка регистров № 0 будут перемещены в аккумулятор. Здесь 2F хранится в 04H. 04H представляет адрес R4 банка регистра № 0.

В этом режиме адресации адрес данных сохраняется в регистре как операнд.

Здесь значение внутри R0 рассматривается как адрес, который содержит данные для передачи в аккумулятор. Пример : если R0 имеет значение 20H, а данные 2FH хранятся по адресу 20H, то значение 2FH будет передано в аккумулятор после выполнения этой инструкции. Смотрите следующую иллюстрацию.

Примечание. Только R0 и R1 могут формировать инструкцию косвенной адресации регистра. Другими словами, программист может создать инструкцию, используя @ R0 или @ R1. Все банковские регистры разрешены.

Режим индексированной адресации

Мы возьмем два примера, чтобы понять концепцию индексированной адресации. Посмотрите на следующие инструкции —

MOVC A, @ A + DPTR

MOVC A, @ A + ПК

где DPTR — указатель данных, а PC — программный счетчик (оба являются 16-разрядными регистрами). Рассмотрим первый пример.

Операндом-источником является @ A + DPTR. Он содержит исходные данные из этого места. Здесь мы добавляем содержимое DPTR с текущим содержимым аккумулятора. Это дополнение даст новый адрес, который является адресом исходных данных. Данные, указанные по этому адресу, затем передаются в аккумулятор.

Режим индексированной адресации

Код операции 93H. DPTR имеет значение 01FE, где 01 находится в DPH (старшие 8 бит), а FE находится в DPL (младшие 8 бит). Аккумулятор имеет значение 02H. Затем выполняется 16-разрядное сложение, и 01FE H + 02H приводит к 0200 H. Данные в местоположении 0200H будут переданы в аккумулятор. Предыдущее значение внутри аккумулятора (02H) будет заменено новыми данными с 0200H. Новые данные в аккумуляторе выделены на рисунке.

Это 1-байтовая инструкция с 2 циклами, необходимыми для выполнения, и время выполнения, требуемое для этой инструкции, является высоким по сравнению с предыдущими инструкциями (которые все были по 1 циклу каждая).

Другой пример MOVC A, @ A + PC работает так же, как и в предыдущем примере. Вместо добавления DPTR с помощью аккумулятора, данные внутри счетчика программ (ПК) добавляются вместе с аккумулятором для получения целевого адреса.

Читайте также: