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
Адресация стека
Компьютеры, ориентированные на стек, имеют инструкцию по проталкиванию содержимое ячейки памяти или регистра в стек. инструкции без адресов используются вместе со стеком. Эта форма адресация указывает, что два операнда должны быть извлечены из стек, одна за другой, выполняемая операция и результат помещается обратно в стек.
Немедленная и прямая адресация
Немедленная и прямая адресацияОпределение режимов
Два самых основных режима адресации называются «немедленный» и «прямой».
- Немедленная адресация
- При непосредственной адресации сама инструкция содержит значение, которое будет использоваться. Это похоже на использование постоянной, такой как 7 или 39 в выражение на языке более высокого уровня.
- Прямая адресация
- При прямой адресации инструкция сообщает, где значение может быть быть найдено, но само значение отсутствует в памяти. В высоком язык уровня, прямая адресация часто используется для вещей как глобальные переменные.
Примеры на языках высокого уровня
Предположим, у нас есть оператор на языке C вроде
я = j + 3;
i
и j
являются переменными, поэтому они отсутствуют в
Память. Чтобы выполнить этот оператор, нам нужно будет получить j
по памяти, и записываем наш результат в i
.
Это означает, что инструкции, которые мы генерируем, должны иметь адреса i
и j
, и нужно читать и записывать их
адреса по мере необходимости.
С другой стороны, число 3
является фактическим значением.
появляется в заявлении. Итак, наш код должен включать 3
сам.
Даже если мы определим символ, например
#define FRED 3
i = j + FRED;
FRED
заменяется на 3, а немедленная адресация по-прежнему
в конечном итоге используется.
Преобразование в код сборки
В ассемблерном коде описанный здесь оператор состоит из трех шагов:
- Получить
j
из памяти. - Добавьте к нему константу
3
. - Поместить результат в память по адресу
i
В ассемблерном коде это выглядит так:
ldaa j
adda #3
staa i
Указание режима Direct и Immediate в коде сборки
В языке высокого уровня мы (обычно) не указываем адресацию
режимы. Вместо этого мы просто используем переменные и константы и полагаемся на
язык, чтобы знать, о чем мы говорим: если мы используем константу 3
компилятор генерирует немедленный режим; если мы воспользуемся
переменная j
компилятор генерирует прямой режим.
Ассемблер так не работает. На этом уровне ассемблер
совершенно счастлив использовать константу 1
в качестве прямого адреса или
используйте адрес j
в качестве непосредственного значения. Итак, у нас есть
чтобы сообщить ассемблеру, что мы хотим сделать.
Мы делаем это, помещая #
непосредственно перед
операнд для непосредственной адресации и оставления его для прямой
адресация. Если мы забудем #
, ассемблер
быть совершенно счастливым; это не ошибка. Но скорее всего это баг!
Расширенная адресация
Многие маленькие компьютеры (включая HC11) на самом деле должны
прямая адресация, поэтому мы можем более эффективно обрабатывать небольшие адреса
чем большие адреса. В HC11 адрес между $0000
и $00ff
можно представить как восемь
бит, а адреса от $0100
до $ffff
требуется 16. Вызываются восьмибитные адреса
«прямые», а 16-битные адреса называются «расширенными».
Нам не нужно беспокоиться о прямых адресах и расширенных адресах . Если есть возможность использовать прямой адрес (в инструкции есть прямой форме, а адрес будет состоять из восьми битов) ассемблер генерировать прямой адрес; в противном случае будет сгенерировано расширенное адрес.
Резервирование места для переменных
Можно было бы полностью определить переменные в ассемблерном коде «рукой.» У нас мог бы быть код, который говорит что-то вроде
i экв 0
j экв 1
Что бы установить i
по адресу 0000 16 и j
по адресу 0001 16 . Пока это будет работать,
неудобно и легко ошибиться. это достаточно проблематично
для скалярных переменных; когда мы доберемся до массивов, будет очень плохо.