Начнем с того, что 90% работы процессора связано с оперативной памятью. Он берет оттуда данные, обрабатывает их и отсылает обратно в память. Кроме этого, сам процессор имеет собственную память, называемую регистрами. Графически это можно изобразить так:
где слева регистры процессора R1, R2 … Rn, а справа ячейки памяти. Зачем нужны регистры? Давайте рассмотрим такую вот ситуевину: в процессор поступает некоторое количество данных. Говоря языком умным – несколько операндов и с ними необходимо провести некоторые действия. Поступили эти операнды из оперативной памяти и процессор по команде начал с ними работать. Поскольку действий над ними несколько, то работа разбивается на несколько этапов и результат каждого необходимо запомнить. Спрашивается: где запомнить? Можно конечно отправить в ячейки оперативной памяти, но на передачу и запись этих данных в память уйдет время, так как память работает значительно медленнее процессора. К тому же учтите, что записывать мы будем промежуточные результаты, которые необходимо будет еще много раз использовать. Потеря времени налицо, как говорится! Поэтому используются регистры внутри процессора, которые работают значительно быстрее, по сути дела на тактовой частоте процессора. К тому же адресация к ним происходит быстрее. А вот о типах адресации мы и поговорим ниже.
Но для начала определимся с форматом команды. Что это за фигня такая? Скажу умно: под форматом команды понимают совокупность размера всех полей и их расположения в команде. Представим себе упрощенный вид команды:
Команда делится на две области: область кода операции и область адресов. Вначале идет код операции (КОП) который говорит, что вообще необходимо делать, а затем идет адрес операнда/операндов с которым/которыми это надо делать. Адресная область может состоять из нескольких частей – это, так называемые многоадресные команды. С точки зрения программиста, наиболее удобны трехадресные (ранее были распространены четырехадресные, которые уже практически не применяются).
Адресная область состоит из трех полей: в первых двух лежат адреса операндов, а в третье будет записан адрес результата действия над операндами.
В двухадресных командах адресная область состоит из двух полей: поле адреса первого операнда и поле адреса второго операнда. Адрес результата действия над операндами будет записан в первое поле.
В одноадресных командах адресная область состоит из одного единственного поля, в котором лежит адрес операнда, а адрес второго операнда и результата совпадает с сумматором. Существуют так же и безадресные команды, которые применяются при работе со стеками. Чаще всего используются двух-, одно- и безадресные команды.
Но это еще не все. Фигня заключается в том, что операнды эти могут лежать черт те где. Об этом знает только та программа, которая, собственно, их и запрашивает. Для того, чтобы процессор нашел нужные операнды, в поле адреса операнда вкладывают … адрес операнда (то есть тот адрес, по которому, обратившись, процессор найдет операнд или, проще говоря, необходимые данные).
Но не все так просто! Существует несколько типов адресации. Начнем с непосредственной адресации – это клинический случай, когда вместо адреса операнда в команде указывается сам операнд (правда, если он представляет целое число). Выбрав из памяти код операции, процессору уже нет необходимости лезть опять в память за самим операндом, ведь он передается вместе с КОП.
Но такое не всегда бывает. Если в команде указан полный адрес ячейки, где лежат необходимые данные, то это уже полный или абсолютный тип адресации.
Кроме этого, в поле адреса операнда может быть указан адрес или регистра или ячейки памяти, в которой лежит то же адрес, по которому можно найти ячейку с нужным операндом.
Такой способ адресации называться косвенным. При косвенной адресации количество ячеек с адресами других ячеек может быть несколько (цепочка). Количество звеньев (или ступеней перехода) называется глубиной косвенной адресации.
Все выше приведенные типы адресации касались одного операнда. А как же быть в случае с несколькими операндами или говоря другим языком – массивами? Тогда обычно указывается адрес массива и номер (индекс) элемента. Базовый (начальный) адрес указывается в команде. Кроме этого, там же, в команде, есть поле, где указан номер регистра, в котором лежит значение индекса или номер ячейки в массиве относительно начального адреса. Тогда адрес каждой ячейки массива будет получаться из суммы начального адреса и того, что содержит указанный регистр. Такая фигня называется модификацией адресов. Кроме того, существует тип адресации, когда в регистре лежит начальный адрес. В команде указан адрес этого регистра, а так же записано смещение относительно начального адреса. Все остальные адреса операндов будут получены из суммы адреса и смещения. Такой вот тип адресации называется относительным.
Ну что, сложно? Нет, это еще не сложно! Сложно будет сейчас :). При относительной адресации можно еще и модифицировать адреса. В этом случае адрес будет равен сумме начального адреса плюс смещение плюс содержимое индексного регистра.
Если система использует несколько типов адресации, то в команде обязательно записывается, какой способ будет применен в данный момент. Говоря языком ученым, в команде указывается признак адресации в поле признака операции.