Опубликован: 01.03.2016 | Доступ: свободный | Студентов: 468 / 20 | Длительность: 03:55:00
Лекция 4:

Методы адресации

< Лекция 3 || Лекция 4 || Лекция 5 >

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

Прямая или абсолютная адресация

Физический адрес операнда содержится в адресной части команды. Формальное обозначение:

Операнд_i=(А_i)

где А_i- код, содержащийся в i-м адресном поле команды.

.data
num:
        .long    0x12345678

.text
main:
        movl    (num), %eax   /* Записать в регистр %eax операнд, 
                                 который содержится в оперативной 
                                 памяти по адресу метки num          */
        
        addl    (num), %eax   /* Сложить с регистром %eax операнд, 
                                 который содержится в оперативной 
                                 памяти по адресу метки num и записать 
                                 результат в регистр %eax            */
        
        ret

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

В команде содержится не адрес операнда, а непосредственно сам операнд.

Операнд_i= А_i

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

Пример:

.text
main:
        movl    $0x12345, %eax       /* загрузить константу 0x12345 в 
                                        регистр %eax.                */

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

Адресная часть команды указывает адрес ячейки памяти или регистр, в котором содержится адрес операнда:

Операнд_i= ((А_i))

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

Пример:

.data
num:
        .long   0x1234

.text
main:
        movl    $num, %ebx      /* записать адрес метки в регистр 
                                   адреса %ebx                       */

        movl    (%ebx), %eax    /* записать в регистр %eax операнд из 
                                   оперативной памяти, адрес которого 
                                   находится в регистре адреса %ebx  */

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

Автоинкрементная и автодекрементная адресация

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

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

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

Пример:

.text
main:
        movl    $0x12345, %eax  /* записать в регистр константу 0x12345
                                                                     */
        movl    %eax, %ecx      /* записать в регистр %ecx операнд, 
                                   который находится в регистре %eax */
Относительная адресация

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

Операнд_i= (база_i+смещение_i)

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

Рассмотрим два примера:

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

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

< Лекция 3 || Лекция 4 || Лекция 5 >
Виктор Федосов
Виктор Федосов
Россия
Алексей Фомичевский
Алексей Фомичевский
Украина, Запорожье, ЗГИА