Прямая адресация ассемблер: Assembler: Прямая адресация

3. Виды адресация ассемблера

Прямая адресация — это простейший вид адресации операнда в памяти, так как эффективный адрес содержится в самой команде и для его формирования не используется никаких дополнительных источников или регистров. Эффективный адрес берется непосредственно из поля смещения машинной команды, которое может иметь размер 8, 16, 32 бита. Это значение однозначно определяет байт, слово или двойное слово в сегменте данных. Прямая адресация может быть двух типов:

относительная прямая адресация используется в командах условных переходов для указания относительного адреса перехода. Относительность такого перехода заключается в том, что в поле смещения машинной команды содержится 8-, 16- или 32-разрядное значение, которое в результате работы команды будет складываться с содержимым регистра указателя команд IP/EIP. В результате такого сложения получается адрес, по которому и осуществляется переход;

абсолютная прямая адресация — в

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

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

Остальные виды адресации относятся к косвенным. Слово «косвенный» в названии этих видов адресации означает, что в самой команде может находиться лишь Часть эффективного адреса, а остальные его компоненты находятся в регистрах, на которые указывают своим содержимым байт mod r/m и, возможно, байт sib.

Косвенная адресация имеет следующие разновидности:

косвенная базовая, или регистровая, адресация;

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

косвенная индексная адресация со смещением;

косвенная базовая индексная адресация;

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

При косвенной базовой (регистровой) адресации эффективный адрес операнда может находиться в любом из регистров общего назначения, кроме SP/ESP и ВР/ЕВР (это специальные регистры для работы с сегментом стека).

Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки. К примеру, команда mov ax,[ecx] помещает в регистр АХ содержимое слова по адресу сегмента данных со смещением, хранящимся в регистре ЕСХ. Так как содержимое регистра легко изменить в ходе работы программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это очень полезно, например, для организации циклических вычислений и для работы с различными структурами данных типа таблиц или массивов.

Косвенная базовая (регистровая) адресация со смещением является дополнением предыдущего вида адресации и предназначена для доступа к данным с известным смещением относительно некоторого базового адреса. Этот вид адресации используется для доступа к элементам структур данных, когда смещение элементов известно заранее на стадии разработки программы, а базовый (начальный) адрес структуры должен вычисляться динамически на стадии выполнения программы. Модификация содержимого базового регистра позволяет обращаться к одноименным элементам различных экземпляров однотипных структур данных.

К примеру, команда mov ax,[edx+3h] пересылает в регистр АХ слово из области памяти по адресу, определяемому содержимым EDX + 3h. Команда mov ax,mas[dx] пересылает в регистр АХ слово по адресу, определяемому содержимым DX плюс значение идентификатора mas (причем транслятор присваивает каждому идентификатору значение, равное смещению этого идентификатора относительно начала сегмента данных).

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

масштабирования содержимого индексного регистра, а именно байта sib. При описании структуры этого байта отмечалось, что он состоит из трех полей. Одно; из этих полей — поле масштаба (ss), на значение которого умножается содержимое индексного регистра. К примеру, в команде mov ax,mas[esi*2] значение эффективного адреса второго операнда определяется выражением mas+(esi)*2. В связи с тем, что в ассемблере нет средств индексации массивов, программисту приходится организовывать ее своими силами. Наличие возможности масштабирования существенно помогает в решении этой проблемы, но при условии, что размер элементов массива составляет 1, 2, 4 или 8 байт.

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

Например: mov еах, [esi][edx]

В данном примере эффективный адрес второго операнда формируется из двух компонентов, (ESI) + (EDX).

Косвенная базовая индексная адресация со смещением является дополнением косвенной индексной адресации. Эффективный адрес формируется как сумма трех составляющих: содержимого базового регистра, содержимого индексного регистра и значения поля смещения в команде. К примеру, команда mov eax,[esi+5][edx] пересылает в регистр ЕАХ двойное слово по адресу: (ESI) + 5 + (EDX). Команда add ax,array[esi][ebx] складывает содержимое регистра АХ с содержимым слова по адресу, образованному значением идентификатора array + (ESI) + (ЕВХ).

Режимы адресации. — it-black.ru

Режимы адресации. — it-black.ru Перейти к содержимому

Режимы адресации в assembler — это различные способы указания местоположения операндов. Эти режимы позволяют организовать работу с массивами, структурами, локальными переменными и указателями.

Сегодня мы рассмотрим все режимы адресации.

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

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

Операнд (байт или слово) находится в регистре. Способ применим ко всем программно-адресуемым регистрам процессора. Например:


push  DS	;Сохранение  DS  в  стеке
mov	BP,SP	;Пересылка  содержимого  SP  в  ВР
Непосредственная адресация

Операнд (байт или слово) может быть представлен в виде числа, адреса, кода ASCII, а также иметь символьное обозначение. Например:


mov	AX, 4C00h	    ;Операнд  -   16-ричное  число
mov	DX,offset  mas  ;Смещение  массива  mas   заносится  в  DX
mov	DL,'!'	        /Операнд  -   код  ASCII   символа   '!'
num=9	            /Число   9  получает  обозначение  num
mov	CX,num	        ;Число,   обозначенное  num,   загружается  в  СХ
Прямая адресация памяти

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


mov DL,meml	  ;Содержимое  байта  памяти с  символическим именем meml
                  ; пересылается  в  DL 

Если нужно обратиться к ячейке памяти с известным абсолютным адресом, то этот адрес можно непосредственно указать в качестве операнда. Предварительно необходимо настроить какой-либо сегментный регистр на начало того участка памяти, в котором находится искомая ячейка. Например:


mov	AX, 0	        ;Настроим сегментный регистр ES на
mov	ES,AX	        ;самое начало памяти (адрес 0)
mov	AX,ES:[0]	;АХ=содержимое слова с адресом 0000h:0000h
mov	DX,ES:[2]	;ОХ=содержимое слова с адресом 0000h:0002h
Неявная адресация

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


cbw
mul al

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

Facebook

Twitter

  • No Comments

Группа в VK

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Облако меток

Похожие статьи

Команды работы с битами.

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

Основы создания макросов в Assembler.

Макросы — это шаблоны для генерации кода. Один раз создав макрос, можно использовать его во многих местах в коде программы. Макросы делают процесс программирования на

Синтаксис объявления меток.

Метка в ассемблере – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду. Метка может содержать следующие символы: Буквы (от A до Z и

Локальные переменные.

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

Instagram Vk Youtube Telegram Odnoklassniki

Полезно знать

Рубрики

Авторы

Различная адресация памяти (примеры LOAD)

Сун Лю

Непосредственный операнд

Самый простой способ для инструкции указать операнд — это адресная часть инструкции, фактически содержащая сам сперанд а не адрес или другая информация, описывающая, где операнд является. Такой операнд называется непосредственным операндом, потому что он автоматически извлекается из памяти одновременно с инструкцией сама достается. Он сразу же доступен для использования.
Пример: ЗАГРУЗИТЬ R1, =100 Загрузить число 100 в регистр R1.
 

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

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

Например:

1) LOAD R1, 100 Загрузить содержимое памяти с адресом 100 в регистр R1.

2) ЗАГРУЗИТЬ R1, R2 Загрузить содержимое регистра R2 в регистр R1.
 

Косвенная адресация

Косвенная адресация — это схема, в которой адрес указывает, какой слово памяти или регистр содержит не операнд, а адрес операнд.
Например:

1) LOAD R1, @100 Загрузить содержимое адреса памяти, хранящегося в памяти
адрес 100 в регистр R1.

   Р1 М[100] М[200]

- 200 10
   НАГРУЗКА R1,@100 10 200 10



2) ЗАГРУЗИТЬ R1, @R2 Загрузить содержимое адреса памяти, сохраненного в

зарегистрируйте R2, чтобы зарегистрировать R1. 
 

Индексированная адресация

Адреса состоят из двух частей: номера индексного регистра и постоянный. Адрес операнда представляет собой сумму константы и содержимое индексного регистра. Он содержит индексированную (прямую) адресацию, индексированная немедленная адресация и индексированная косвенная адресация.
Например:

1) LOAD R1, 100(R2) Загрузить содержимое адреса памяти, который
сумма 100 и содержимое регистра R2 до
зарегистрируйтесь R1.

   R1 R2 М[100] М[110]

- 10 200 150
   НАГРУЗКА R1, 100(R2) 150 10 200 150



2) ЗАГРУЗИТЬ R1, =100(R2) Загрузить сумму 100 и значение регистра R2
зарегистрировать R1.


3) LOAD R1, @100(R2) Загрузить содержимое адреса памяти, сохраненного в
адрес памяти, который является суммой 100 и
число в регистре R2 в регистр R1.

   R1 R2 М[100] М[110] М[150]

- 10 200 150 300
   НАГРУЗКА R1, @100(R2) 300 10 200 150 300

 

Адресация стека

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

Режимы адресации — GeeksforGeeks

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

Режимы адресации для инструкций 8086 делятся на две категории:

1) Режимы адресации для данных

2) Режимы адресации для ветвей

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

Инструкция программы на ассемблере состоит из двух частей


Адрес памяти операнда состоит из двух компонентов:  

ВАЖНЫЕ ТЕРМИНЫ

  • Начальный адрес сегмента памяти.
  • Действующий адрес или смещение : Смещение определяется путем сложения любой комбинации трех элементов адреса: смещение, основание и индекс.
    • Смещение: Это 8-битное или 16-битное непосредственное значение, указанное в инструкции.
    • Base : Содержимое базового регистра, BX или BP.
    • Индекс : Содержимое индексного регистра SI или DI.

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

 Пример:  CLC (используется для сброса флага переноса в 0) 
  • Режим немедленной адресации (символ #): В этом режиме данные присутствуют в адресном поле инструкции. Создан как один формат адресной инструкции.
    Примечание: Ограничение в прямом режиме заключается в том, что диапазон констант ограничен размером поля адреса.
     Пример: MOV AL, 35H (переместить данные 35H в регистр AL) 
  • Режим регистра: При адресации регистра операнд помещается в один из 8-битных или 16-битных регистров общего назначения. Данные находятся в регистре, указанном инструкцией.
    Здесь для доступа к данным требуется одна ссылка на регистр.
     Пример: MOV AX,CX (переместить содержимое регистра CX в регистр AX) 
  • Регистр Косвенный режим : при этой адресации смещение операнда помещается в любой из регистров BX,BP,SI,DI как указано в инструкции. Фактический адрес данных находится в базовом регистре или индексном регистре, указанном в инструкции.
    Здесь для доступа к данным требуется ссылка на два регистра.

    ЦП 8086 позволяют осуществлять непрямой доступ к памяти через регистр с использованием режимов косвенной адресации регистров.
     MOV AX, [BX](переместить содержимое ячейки памяти s
    адресуется регистром BX регистру AX) 
  • Auto Indexed (режим приращения) : Эффективный адрес операнда — это содержимое регистра, указанного в инструкции. После доступа к операнду содержимое этого регистра автоматически увеличивается, чтобы указать на следующую последовательную ячейку памяти. (R1)+ .
    Здесь для доступа к данным требуется одна ссылка на регистр, одна ссылка на память и одна операция АЛУ.
    Пример:
     Добавить R1, (R2)+  // ИЛИ
    R1 = R1 + M[R2]
    R2 = R2 + d 

    Полезно для прохода по массивам в цикле. R2 — начало массива d — размер элемента

  • Автоиндексация (режим декремента) : Эффективный адрес операнда — это содержимое регистра, указанного в инструкции. Перед доступом к операнду содержимое этого регистра автоматически уменьшается, чтобы указать на предыдущую последовательную ячейку памяти. (R1)
    Здесь для доступа к данным требуется одна ссылка на регистр, одна ссылка на память и одна операция АЛУ.
  • Пример:

     Добавить R1,-(R2)   //ИЛИ
    R2 = R2- д 
    R1 = R1 + M[R2] 

    Режим автоматического уменьшения аналогичен режиму автоматического увеличения. Оба варианта также можно использовать для реализации стека как push и pop. Режимы автоинкремента и автодекремента полезны для реализации структур данных «последним пришел — первым вышел».

  • Режим прямой адресации/абсолютной адресации (символ [ ]): Смещение операнда задается в инструкции как 8-битный или 16-битный элемент смещения. В этом режиме адресации 16-битный эффективный адрес данных является частью команды.
    Здесь для доступа к данным требуется только одна операция обращения к памяти.

     Пример: ADD AL,[0301]   //добавить содержимое адреса смещения 0301 в AL 
  • Режим косвенной адресации (символ @ или () ) :В этом режиме поле адреса инструкции содержит адрес эффективного адреса. Здесь требуются две ссылки.
    1-я ссылка для получения эффективного адреса.
    2-я ссылка для доступа к данным.

    В зависимости от наличия эффективного адреса, косвенный режим бывает двух видов:

    1. Непрямой регистр: в этом режиме эффективный адрес находится в регистре, и соответствующее имя регистра будет поддерживаться в адресном поле инструкции.
      Здесь для доступа к данным требуется одна ссылка на регистр, одна ссылка на память.
    2. Косвенная память: в этом режиме эффективный адрес находится в памяти, и соответствующий адрес памяти будет поддерживаться в поле адреса инструкции.
      Здесь для доступа к данным требуется две ссылки на память.
  • Режим индексированной адресации : Смещение операнда представляет собой сумму содержимого индексного регистра SI или DI и 8-битного или 16-битного смещения.
     Пример: MOV AX, [SI +05] 
  • Индексированная адресация на основе: Смещение операнда представляет собой сумму содержимого базового регистра BX или BP и индексного регистра SI или DI.
  • Оставить комментарий

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *