
Информатика_140800 / 2011-2012-учебный год / 1_семестр / Сам_изуч / Способы_поиска_операндов_память_ЭВМ
.docСПОСОБЫ ПОИСКА ОПЕРАНДОВ В ОПЕРАТИВНОЙ ПАМЯТИ ЭВМ
Вспомним, что в коде команды содержится информация о данных, над которым нужно совершить некоторую операцию. Эти данные называют операндами. Обычно операнды содержатся в оперативной или регистровой памяти ЭВМ. Способ поиска операндов в памяти также определяет формат команды.
Существуют 2 различных принципа поисков операндов в памяти: ассоциативный и адресный:
- Ассоциативный поиск (поиск по содержанию запоминающей ячейки) предполагает просмотр содержимого всех ячеек памяти для выявления кода, содержащего заданный командой ассоциативный признак.
- Адресный поиск предполагает, что операнд находится по адресу, указанному в адресном поле команд.
Различают исполнительный адрес операнда и адресный код команды.
Исполнительным адресом операнда называется двоичный код номера ячейки памяти, по которому будет записан или считан операнд.
Адресным кодом команды называется двоичный код в адресном поле команды, с помощью которого необходимо сформировать исполнительный адрес операнда. В ЭВМ адресный код и исполнительный адрес не совпадают, поэтому способ адресации можно определить, как способ формирования исполнительного адреса по адресному коду команды.
Эти понятия в дальнейшем будем использовать в описании способов адресации к операндам.
Способы адресации к операндам в зависимости от типа поиска операндов в памяти классифицируют:
-
по наличию адресной информации в команде на:
- явную адресацию. При таком способе в коде команде есть поле адреса этого операнда;
- неявную адресацию. При таком способе адресное поле в команде отсутствует, а адрес операнда подразумевается кодом операции. Например, из команды может быть исключен адрес приемника адресата, при этом подразумевается, что результат записывается на месте второго операнда.
2) по кратности обращения в оперативную память:
- непосредственную адресацию (direct addressing). При непосредственной адресации операнд располагается непосредственно в адресном поле команды (рисунок 6).
Рисунок 6
- прямую адресацию (immediate addressing). При прямой адресации обращение за операндом производится по адресному коду в поле команды. При этом исполнительный адрес совпадает с адресом кода команды. Это можно проиллюстрировать следующим рисунком (рисунок 7).
Рисунок 7
- косвенную адресацию (indirect addressing). При косвенной адресации код команды указывает адрес ячейки памяти, в которой находится не сам операнд, а его адрес, называемый указателем. Это можно проиллюстрировать следующим рисунком (рисунок 8).
Рисунок 7
3) по способу формирования адресов ячеек памяти:
- Абсолютная адресация предполагают, что двоичный код адреса ячейки памяти может быть целиком извлечен либо из адресного поля команды, либо из какой-нибудь другой ячейки в случае косвенной адресации.
- Относительная адресация предполагают, что двоичный код операнда образуется из нескольких составляющих:
- Б - код базы;
- И - код индекса;
- С - код смещения.
Эти составляющие используются в различных сочетаниях.
Виды относительной адресации:
1) Индексная адресация (рисунок 9).
Рисунок 9
Для формирования адреса операнда используется регистровая память.
Адрес i -операнда в массиве определяется как сумма начального адреса массива операнда, задаваемого смещением S, и индекса i , записанного в одном из регистров регистровой памяти, называемым индексным регистром.
Адрес индексного регистра задается в команде полем адреса индекса Аи.
В каждом i-том цикле содержимое индексного регистра изменяется на постоянную величину, как правило, это 1.
Для работы программ с массивами, требующими однотипных операций над элементами массива, удобно использовать такой тип адресации
2) Автоиндексная адресация. При автоиндексации косвенный адрес, находящийся в регистре РП, автоматически увеличивается (автоинкрементная адресация), или уменьшается (автодекрементная адресация) на постоянную величину до или после выполнения операции.
3) Стековая адресация. Стековая память широко используется в современных ЭВМ. Хотя адрес обращения в стек отсутствует в команде, он формируется схемой управления (рисунок 9):
Рисунок 9
Для чтения записи доступен только один регистр - вершина стека.
Этот способ адресации используется, в частности, системой прерывания программ при вызовах подпрограмм.
Стековая память реализуется на основе обычной памяти с использованием указателя стека и автоиндексной адресации. Логически ячейки памяти, отводимые под стек, организованы так, чтобы считывание последнего записанного адреса производилось первым, а первого записанного адреса производилось последним. Такая логическая организация формируется специальным счётчиком. Этот счётчик называется указателем стека SP – это регистр микропроцессора. Ячейка памяти, в которую в данный момент может быть записан, например адрес возврата из подпрограммы, называется вершиной стека. Количество ячеек памяти, предназначенных для организации стека, называется глубиной стека. Последняя ячейка памяти, в которую можно производить запись называется дном стека. Запись в стек производится с использованием автодекрементной адресации, а чтение - с использованием автоинкрементной адресации (рисунок 10).
Рисунок 10
Пример. Вызов подпрограммы, написанной на языке С.
В языке С подпрограммы называются функциями. Функция может иметь аргументы и локальные переменные, т. е. переменные, существующие только в процессе выполнения функции. Предположим, функция зависит от двух входных аргументов х и у целого типа и использует три локальные переменные а, b и с также целого типа. Функция возвращает целое значение.
Подпрограмма:
Основная программа:
Например, в определённом месте программы вызывается функция f с аргументами х = 2, у = 3. Вызывающая программа помещает фактические значения аргументов х и у функции f в стек, при этом наверху стека лежит первый аргумент функции, под ним — второй аргумент. При выполнении инструкции вызова функции вверх стека помещается также адрес возврата. В начале работы функции f стек имеет следующий вид:
Перед выполнением функция f должна захватить в стеке область памяти под свои локальные переменные а, b, с.