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 (причем транслятор присваивает каждому идентификатору значение, равное смещению этого идентификатора относительно начала сегмента данных).
Косвенная индексная адресация со смещением очень похожа на косвенную базовую адресацию со смещением. Здесь также для формирования эффективного адреса используется один из регистров общего назначения. Но индексная адресация обладает одной интересной особенностью, которая очень удобна для работы с массивами. Она связана с возможностью так называемого
При косвенной базовой индексной адресации эффективный адрес формируется как сумма содержимого двух регистров общего назначения: базового и индексного В качестве этих регистров могут применяться любые регистры общего назначения, при этом часто содержимое индексного регистра масштабируется.
Например: 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 фиксировано положение первого множителя и результата. Такой режим адресации делает машинную команду короткой, так как в ней отсутствует указание одного или нескольких операндов.
- Виктор Черемных
- 18 августа, 2017
- 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)
Здесь для доступа к данным требуется одна ссылка на регистр.
Пример: MOV AX,CX (переместить содержимое регистра CX в регистр AX)
Здесь для доступа к данным требуется ссылка на два регистра.
ЦП 8086 позволяют осуществлять непрямой доступ к памяти через регистр с использованием режимов косвенной адресации регистров.
MOV AX, [BX](переместить содержимое ячейки памяти s адресуется регистром BX регистру AX)
Здесь для доступа к данным требуется одна ссылка на регистр, одна ссылка на память и одна операция АЛУ.
Пример:
Добавить R1, (R2)+ // ИЛИ R1 = R1 + M[R2] R2 = R2 + d
Полезно для прохода по массивам в цикле. R2 — начало массива d — размер элемента
Здесь для доступа к данным требуется одна ссылка на регистр, одна ссылка на память и одна операция АЛУ.
Пример:
Добавить R1,-(R2) //ИЛИ R2 = R2- д R1 = R1 + M[R2]
Режим автоматического уменьшения аналогичен режиму автоматического увеличения. Оба варианта также можно использовать для реализации стека как push и pop. Режимы автоинкремента и автодекремента полезны для реализации структур данных «последним пришел — первым вышел».
Здесь для доступа к данным требуется только одна операция обращения к памяти.
Пример: ADD AL,[0301] //добавить содержимое адреса смещения 0301 в AL
1-я ссылка для получения эффективного адреса.
2-я ссылка для доступа к данным.
В зависимости от наличия эффективного адреса, косвенный режим бывает двух видов:
- Непрямой регистр: в этом режиме эффективный адрес находится в регистре, и соответствующее имя регистра будет поддерживаться в адресном поле инструкции.
Здесь для доступа к данным требуется одна ссылка на регистр, одна ссылка на память. - Косвенная память: в этом режиме эффективный адрес находится в памяти, и соответствующий адрес памяти будет поддерживаться в поле адреса инструкции.
Здесь для доступа к данным требуется две ссылки на память.
Пример: MOV AX, [SI +05]