Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные средства и системы.doc
Скачиваний:
43
Добавлен:
13.11.2019
Размер:
15.2 Mб
Скачать

1.5. Адресация данных

Представление адресной информации. Источниками и приемниками операндов команд служат регистровая память RSEG, память данных DSEG, а также порты ВВ IOSEG. В дальнейшем для обозначения какого-либо элемента регистровой области будем использовать символ reg, адреса системной памяти—addr, порта ВВ—port. Адрес операнда, считываемого или размещаемого в одном из пространств МС, называется исполнительным.

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

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

Необходимость адресовать память большой емкости при коротком слове данных придает проблеме адресации в МС особо острый характер. Поэтому механизмы адресации памяти в МС оказываются наиболее совершенными и требуют минимального числа обращений к магистрали.

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

Явная форма представления адресной информации более гибкая. Она позволяет связывать с одной операцией множество адресов, что повышает ее эффективность. Однако эта форма требует увеличения длины машинной команды, что снижает эффективность объектного кода. Неявная форма связывает часть адресной информации с операцией, сужая область ее действия, но длина машинной команды при этом существенно уменьшается. В реальных командах, как правило, применяются обе формы представления адресной информации. Широко распространена и такая форма представления адресных сведений: часть информации о месте нахождения одного и того же операнда передается в неявной форме, остальная информация представляется в адресном поле в явной форме.

В общем случае кодирование адресной информации операнда в команде сводится к указанию способа адресации mod и числовой информации, используемой при этом способе. Способ адресации как часть адресной информации может кодироваться в явной и неявной формах. Общепризнанной является явная форма представления mod, при которой в адресной части машинной команды резервируется специальное поле, а на уровне символьного кодирования—ряд специальных суффиксов, префиксов и указателей в поле операндов: #, @, %, (...), (...)+, –(...) и т. д. Например:

.disp ;oper = (PC + disp)

(reg)+ ;oper = (reg), regreg + 1

@addr ;oper = ((addr))

#data ;oper = data

При неявной форме кодирования способ адресации передается ОР, тогда как дополнительная информация представляется явно. Примерами такого представления служат команды

STAX reg ;(reg)A

MVI reg, data ;reg#data

BR disp ;PCPC + disp

Они эквивалентны следующим командам:

ST A, @reg

MOV reg, #data

JMP .disp

Однокомпонентные способы адресации. Самым простым способом задания места расположения данных является включение его полного адреса в состав команды (рис. 1.19, а). Применительно к основной памяти данных МС такой способ адресации называется прямым (ptr = addr). Прямая адресация дает возможность явно указать на любую конкретную ячейку памяти во всем адресном пространстве DSEG. Примером команды с прямой адресацией служит

INC addr ;addr(addr) + 1

Рис. 1.19. Способы адресации данных:

а—прямая; б—регистровая; в—прямая адресация портов; г—непосредственная

Для явного задания полного m-разрядного адреса в команде должно быть выделено m разрядов. С целью сокращения числа разрядов во многих системах используется короткий вариант прямой адресации, обеспечивающий непосредственный доступ к ограниченной, заранее определенной области памяти. Как правило, это наиболее важная нижняя и (или) верхняя часть адресного пространства. Короткая прямая адресация может быть достаточно эффективной в МС гарвардского типа.

Неявная форма представления прямой адресации приводит к указанию конкретной ячейки системной памяти. Такой способ адресации используется крайне редко.

Основной недостаток прямой адресации состоит в том, что манипуляция адресом связана с изменением объектного кода, которое не всегда возможно. Например, в МС гарвардского типа доступ к CSEG с целью модификации объектного кода логически запрещен. В МС неймановского типа доступ к кодовому сегменту может быть тоже запрещен, но уже на физическом уровне, так как исполняемая программа записана в ПЗУ. В любом случае модификация объектного кода нежелательна, что связано со значительными трудностями при его анализе, например, с целью отладки. Использование прямой адресации ограничено случаем, когда расположение данных в памяти известно заранее и не изменяется в процессе исполнения программы. Для МС гарвардского типа могут быть предусмотрены специальные варианты доступа к CSEG с прямой адресацией для считывания констант и постоянных таблиц, которые могут храниться в ней. При этом выбор кодового сегмента кодируется неявно. Применительно к регистровой памяти вариант прямого включения адреса в команду приводит к регистровой адресации (ptr = reg) (рис. 1.19,б). Для прямой ссылки на регистр, входящий в состав небольшой регистровой памяти МС, обычно требуется несколько бит. Кроме того, отсутствуют циклы обращения к системной магистрали. Все это обеспечивает большую эффективность регистровой адресации. Распределение данных по регистрам легко контролируется программистом и не вызывает особых затруднений при ссылке на них. Приведем примеры команд с регистровой адресацией:

MOV reg, addr ;reg(addr)

NEG reg ;reg – reg

В МС широко распространена неявная форма регистровой адресации, когда код операции подразумевает вполне конкретный регистр, например аккумулятор А:

LDA addr ;эквивалентно MOV A, addr

ANA reg ;эквивалентно AND A, reg

На уровне мнемокода регистровая адресация отличается от прямой использованием специальных имен, зарезервированных для обозначения регистров A, X, Ri и т. д. В некоторых системах вводится специальный символ регистровой адресации %:

CLR %n ;Rn0

Здесь nцелое, указывающее на конкретный регистр области. Обычно регистровая адресация—единственный способ доступа к пространству регистров МС.

Прямая адресация портов (ptr = port) используется для адресации изолированного пространства портов ВВ (рис. 1.19, в). Доступ к портам обычно задается неявно кодом операции:

IN port ;Aport

OUT port ;portA

Иногда для этой цели применяют резервные имена портов:

ANL Рn ;PnA AND Pn, n = 0—7

Очень часто прямая адресация портов является единственным способом доступа к пространству ВВ. Встречается также вариант прямой короткой адресации портов, например, в системе команд К1810ВМ86.

В некоторых случаях источником данных служит сама команда (рис. 1.19, г). Тогда говорят о непосредственной адресации (prt = #data), которая позволяет задавать константы как часть команды:

MOV reg, #data ;regdata

ADD reg, #data ;regreg + data

Для более эффективного кодирования операций с часто используемым непосредственным операндом—литераломобычно вводят специальные коды с неявным определением данных:

CLR reg ;reg0

INC reg ;regreg + 1

или варианты короткой непосредственной адресации:

INC reg, #sdata ;regreg + sdata

Здесь sdata может восприниматься как целое без знака или как целое со знаком. В любом случае перед выполнением операции sdata расширяется с учетом знака до полноразмерного операнда. Основной недостаток непосредственной адресацией состоит в отсутствии возможности манипуляции данными без модификации объектного кода, что привело к созданию ряда способов с вычисляемым адресом. Простейшим среди них является косвенная адресация (ptr = @addr или (addr)), схема выполнения которой показана на рис. 1.20, а. В командах с данным типом адресации используется не прямой адрес, а косвенный, указывающий на ячейку памяти с адресом операнда. Манипуляция исполнительным адресом сводится к изменению содержимого этой ячейки памяти и, следовательно, никак не связана с объектным кодом. К недостаткам косвенной адресации следует отнести двойное обращение к основной памяти и большую разрядность поля, отводимого под косвенный адрес.

Рис. 1.20. Способы адресации данных: a—косвенная; б—косвенная регистровая; в— косвенная регистровая адресация портов

Рис. 1.21. Способы адресации с автомодификацией: а—автоинкрементная; б—автодекрементная; в—преавтоинкрементная; г—поставтодекрементная

От вышеуказанных недостатков косвенной адресации свободен ее вариант (рис. 1.20, б), в котором в качестве области, содержащей прямой адрес, используется не основная память данных, а регистровая. При этом все другие свойства, характерные для косвенной адресации, сохраняются, что объясняет широкое применение регистровой косвенной адресации (ptr = @reg или (reg)) практически во всех МС.

Для хранения прямого адреса требуется регистр достаточной длины. В ряде МС аккумуляторного типа для этой цели предусматриваются специальные адресные регистры. В МС с РОН регистры данных при необходимости объединяются в пары для образования адресных регистров. Примерами команд с косвенной регистровой адресацией являются

CLR @reg ;(reg)0

INC @reg ;(reg)(reg) + 1

Пример неявного кодирования данного способа адресации можно привести из системы команд МП КР580ВМ80:

LDAX В ;А(ВС)

STAX D ;(DE)A

Косвенная регистровая адресация портов (рtr = @reg или (reg)) через регистр может быть полезна при доступе к пространству IOSEG (рис. 1.20, в). Благодаря этому удается использовать одну и ту же программу для ВВ через порт, адрес которого заранее неизвестен и может меняться в процессе работы МС. Примеры команд ВВ:

IN @reg ;AI0SEG(reg)

OUT @reg ;IOSEG(reg)A

Для пошагового просмотра таблиц и списков удобно применять косвенную регистровую адресацию. Настройка на следующий адрес элемента выполняется программным способом с помощью операций, манипулирующих с адресным регистром:

LOOP: MOVB ptr, @reg ;Поиск байта

INC reg ;data в строке

СМРВ ptr, #data ;сравнение байтов, начиная с

JNZ LOOP ;адреса (reg)

Очень часто данные располагаются в памяти последовательно (очереди, последовательности, файлы и т. д.). Для повышения эффективности работы со структурами такого типа используются автоинкрементный и автодекрементный способы адресации (ptr = (reg)+, ptr = –(reg)).

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

MOVB dst, (reg)+ ;dst(reg), regreg + 1

При автодекрементной адресации (рис. 1.21, б) содержимое адресного регистра сначала уменьшается на длину операнда, а затем используется как исполнительный адрес:

MOVB dst, –(reg) ;regreg – 1, dst(reg)

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

Комбинирование автоинкрементных способов адресации позволяет организовать стеки с адресным регистром в качестве SP. Для загрузки данных в стек применяется автодекрементная адресация:

MOV –(reg), src

для выталкивания—автоинкрементная:

MOV dst, (reg)+

Доступ к вершине стека TOS осуществляется с помощью косвенной регистровой адресации:

MOV dst, @reg

Указатель стека reg всегда указывает на вершину стека, который заполняется в сторону уменьшения адресов. Это соответствует принятой ранее стандартной организации стека.

Неявно заданный способ адресации с модификацией реализуется в операциях со стеком:

PUSH src ;–(SP)src

POP dst ;dst(SP)+

CALL src ;–(SP)PCsrc

RET ;PC(SP)+

CALL reg, src ;–(SP)regPCsrc

RET reg ;PCreg(SP)+

B этом случае его называют стековым.

Процедура выборки программной последовательности также использует неявно заданную автоинкрементную адресацию по PC. Действительно, после считывания очередного элемента объектного кода указатель PC автоматически увеличивает свое содержимое на 1 или 2, в зависимости от длины программного элемента.

Непосредственную адресацию данных можно интерпретировать как автоинкрементную по PC. Например, программная последовательность

MOVB reg, (PC)+

DB data

эквивалентна команде с литералом

MOVB reg, #data

Здесь DB (Define Byte) не имя какой-либо машинной команды, а символическое обозначение директивы размещения последовательности байтов данных. Эти данные должны быть указаны следом за директивой и при необходимости отделяются друг от друга запятыми. В нашем случае последовательность содержит один байт данных. После приема команды

MOVB reg, (PC)+

указатель PC адресует байт data. После выполнения операции и следующей за ней автоматической модификации он будет указывать на начало новой команды.

Возможны два варианта определения автоинкрементной адресации (ptr = +(reg) и ptr = (reg)–), которые называют преавтоинкрементной и поставтодекрементной соответственно (рис. 1.21, в, г). Их совместное использование также обеспечивает организацию стека с указателем, адресующим TOS. Однако растет такой стек в сторону увеличения адресов.

В общем случае каждой паре автомодификации соответствуют по два типа стека. Эти стеки характеризуются следующими операциями доступа:

Операция PUSH src POP src

Стандартный стек MOV –(reg), src MOV dst, (reg)+

Стек типа 1 MOV (reg)+, src MOV dst, –(reg)

Стек типа 2 MOV +(reg), src MOV dst, (reg)–

Стек типа 3 MOV (reg)–, src MOV dst, +(reg)

В отличие от стандартного стека и стека типа 2 указатель reg в двух новых стеках адресует первую свободную ячейку над TOS. При этом стек типа 1 растет в сторону уменьшения адреса, а стек типа 3 в сторону увеличения. Согласованность операций доступа стандартного стека с операцией выборки объектного кода, а также прямая адресуемость TOS по содержимому SP определили его широкое использование в качестве типового стека МС.

Комбинирование адресации с автомодификацией и косвенной позволяет построить более универсальные способы доступа по сравнению с рассмотренными выше—косвенную автоинкрементную и автодекрементную адресацию (ptr = @(reg)+, ptr = @–(reg)). Четыре способа представлены на рис. 1.22. В их основу положен стандартный вариант автомодификации. Достаточно широкое распространение находит лишь первая пара (рис. 1.22, а, б), которая характеризуется однократным обращением к памяти данных. Вторая пара способов (рис. 1.22, в, г) требует до трех обращений к памяти, что существенно снижает их практическую ценность.

Рис. 1.22. Способы комбинированной адресации:

а—косвенная автоинкрементная; б—косвенная автодекрементная; в—прекосвенная автоинкрементная; г—прекосвенная автодекрементная

Рис. 1.23. Двухкомпонентные способы адресации:

а—по базе ; б—индексная; в—относительная; г—двухкомпонентная косвенная регистровая

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

В случае адресации по базе (ptr = (breg).index) исполнительный адрес формируется по схеме, приведенной на рис. 1.23, а, когда

ea = (breg) + index, MOD 2|ea|

Адресация по базе необходима для организации доступа к конкретным полям блока данных, адрес которого может быть неизвестен во время создания программы. Например, блок данных динамически создается в разных областях памяти или его размещение определяется в момент загрузки. В такой ситуации переменный адрес начала блока (базу) удобно располагать в регистре breg (базовом), а известный относительный адрес элемента (индекс) хранить непосредственно в команде. Допустим и вариант короткого индекса, уменьшающий длину объектного кода: |index| ≤ |ea|. При этом индекс может восприниматься как целое либо без знака (offset), либо со знаком (disp). Во втором случае появляется возможность адресоваться относительно базы в обе стороны. При необходимости для выполнения операции суммирования (breg) + index производится расширение знака короткоразмерного индекса до полного размера.

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

Схема вычисления исполнительного адреса при индексной адресации (ptr = base(ireg)) показана на рис. 1.23, б и похожа на схему вычисления по базе:

ea = base + (ireg), MOD 2|ea|

Однако методика ее использования иная.

Индексная адресация применяется при последовательном доступе к элементам блока (массив, таблица, очередь), адрес размещения которого (база) известен. При этом номер элемента блока (индекс) является переменной, вычисляемой во время исполнения программы. Поэтому индекс удобно хранить в регистре ireg (индексном), а базу—в объектном коде команды. Отличие индексной адресации от адресации по базе состоит в том, что в объектном коде должен храниться полный адрес памяти |base| = |еа|, тогда как в качестве индексного регистра может использоваться регистр меньшей длины. При |ireg| = |ea| индексная адресация включает адресацию по базе. По этой причине последнюю часто называют индексной. В случае нулевой базы индексная адресация с полноразмерным индексом совпадает с косвенной, тогда регистр косвенной адресации называется индексным.

Разновидностью адресации по базе является относительная (PC).disp, при которой в качестве базового регистра breg используется PC (рис. 1.23, в), как правило, указываемый неявно (ptr = .disp).

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

Относительная адресация применяется для создания позиционно-независимых программ, т. е. программ, исполнение которых не зависит от их размещения в памяти. Примерами команд с относительной адресацией являются

MOV reg, .disp ;reg(PC + disp)

JMP .disp ;PCPC + disp

Каждому из вышеприведенных двухкомпонентных способов адресации соответствует вариант косвенной адресации:

@(breg).index Косвенный по базе

@base(ireg) Косвенный индексный

@.disp Косвенный относительный

Здесь исполнительный адрес формируется по схеме

еа = (base + index)

Косвенные варианты требуют двойного обращения к памяти МС, поэтому они не получили широкого распространения.

Двухкомпонентная косвенная регистровая адресация (ptr = (breg) (ireg)) может быть получена, когда обе компоненты—и база, и индекс—заданы косвенно (рис. 1.23, г). Способ симметричен по отношению к своим компонентам только при полноразмерном индексном регистре.

Трехкомпонентные способы адресации. Дальнейшего увеличения числа способов адресации можно достичь при переходе к трехкомпонентным схемам типа прямая + косвенная регистровая. Среди них

(breg).index (ireg) Базированная с индексированием

basе(ireg1) (ireg2) С двойным индексированием

Адресация такого типа используется в МП К1810ВМ86, в котором

index = disp8/disp16

base = offset16