Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400211.doc
Скачиваний:
21
Добавлен:
30.04.2022
Размер:
4.09 Mб
Скачать

2.4. Центральный процессор

В качестве центрального процессора в микролабе используется МП 1810ВМ86 (микросхема D9). Выводы этой БИС и их назначение приведены ниже.

M N/ MX – потенциал задания режима. МП1810ВМ86 может работать в двух режимах. Если MN/MX подключен к источнику питания +5В (логическая единица), то микропроцессор работает в минимальном режиме. При подключении к выводу КОРПУС (логический нуль) – в максимальном режиме. Выбор режима осуществляется с помощью перемычки X2.

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

ADO0 – ADO15двунаправленная тристабильная шина адреса/данных. В первом такте машинного цикла на шине устанавливаются 16 младших разрядов адреса памяти или полные адреса портов ввода/вывода. В остальных тактах по шине передаются данные.

МП КМ18010ВМ86 обладает свойствами как 8– , так и 16–разрядного микропроцессора. Он рассматривает память как последовательность 8–разрядных данных. Для повышения производительности имеется связь с памятью по 16–разрядной магистрали данных. Данные могут передаваться как по младшей половине канала данных (D0 – D7), так и по старшей половине (D8 – D15), а также одновременно по младшей и старшей половинах в форме 16–разрядного слова. Определение того, по какой половине канала данных происходит передача, осуществляется по адресному биту А0 и сигналу разрешения старшей половины канала данных ВНЕ, которые выдаются микропроцессором. Активный уровень обоих сигналов – логический 0. Разряды D0 – D7 передаются через микросхему D20, разряды D8 – D15 – через микросхему D21. D20 и D21 – это 8–разрядные шинные формирователи КР580ВА86.

ADO16 – ADO19 / S3 – S6 - шины адреса/состояния. В первом такте машинного цикла на выходных линиях ADO16 – ADO19 устанавливаются четыре старших разряда кода адреса. В остальных тактах по этим линиям передаются статусные сигналы S3 – S6. S3 – S4 определяют сегментный регистр, используемый для вычисления физического адреса: 00 – ES, 01 – CS, 10 – SS, 11 – DS. S5 отражает состояние флага разрешения прерывания IF, т.е. разрешает (единица) или запрещает (нуль) прерывания. Сигнал S6 не используется.

R D – чтение с шины адреса/данных.

WR (LOCK) – запись на шину адреса/данных (блокировка канала в максимальном режиме).

M /IO – сигнал селектирования памяти (логическая единица) и устройств ввода/вывода (логический нуль) в адресном пространстве системы.

S2 – участвует в определении текущего машинного цикла в максимальном режиме (см. DEN(S0)).

STB(QS0) – строб адреса (состояние очереди команд). STB появляется в качестве стробирующего сигнала в первом такте машинного цикла и идентифицирует наличие на шине кода адреса. Этот сигнал используется для загрузки адреса во внешний регистр.

QS0 и QS1 формируются только в максимальном режиме и отражают состояние очереди команд микропроцессора (см. INTA(QS1)).

BHE/S7 – сигнал разрешения передачи старшего байта данных/сигнал состояния. В первом такте машинного цикла наличие логического нуля на этом выводе означает, что 8 бит данных передаются по старшей половине шины (ADO8 – ADO15). Наличие сигнала BHE позволяет часть восьмибитных устройств ввода/вывода подключить к старшей половине шины, а часть - к младшей (ADO0 – ADO7). В остальных тактах машинного цикла на этой линии выставляется сигнал S7. Его состояние не определено (зарезервировано).

D T/R(S1) – выдача/приём (состояние цикла). Сигнал DT/R определяет направление передачи данных и используется совместно с сигналом стробирования данных DEN для управления режимом работы шинных формирователей. S1 участвует в определении текущего машинного цикла в максимальном режиме (см. DEN(S0)).

(S0) – разрешение передачи данных (состояние цикла). Сигналы S0, S1, S2 определяют тип текущего машинного цикла и формируются только в максимальном режиме микропроцессора согласно табл.1.

Таблица 1

S2

S1

S0

Тип машинного цикла

0

0

0

Обслуживание прерываний

0

0

1

Чтение ВУ

0

1

0

Запись ВУ

0

1

1

Останов

1

0

0

Извлечение кода команды

1

0

1

Чтение ЗУ

1

1

0

Запись ЗУ

1

1

1

Пассивное состояние

RDY – готовность. Сигнал позволяет приостанавливать работу микропроцессора и переводить его в состояние ожидания. Это обеспечивает возможность работы с любым типом внешней памяти и устройств ввода/вывода.

– проверка. Используется совместно с командой WAIT как аппаратно–

программное средство отладки системы. Выведен на разъём X1.1 и находится в неактивном состоянии. При сопряжении с микролабом дополнительных устройств может использоваться по усмотрению пользователя.

RESET – сброс. Инициализируется командой сброса с клавиатуры и переводит микропроцессор в начальное состояние. При этом содержимое регистра сегментного кода CS становится равным FFFFH, а содержимое регистра адреса команды IP – 0000H. Поэтому после снятия сигнала сброса микропроцессор выбирает первую команду из ячейки памяти с адресом FFFF0H. Эта ячейка содержит команду прямого межсегментного перехода на начало программы монитора, которая располагается в ПЗУ по адресам FF000H – FFFFFH [1].

NMI – запрос немаскируемого прерывания. Вход NMI микропроцессора соединён с клавишей ПРЕР [1]. При нажатии этой клавиши МП сохраняет текущее состояние микролаба (засылает в стек содержимое регистров IP, CS и, после очистки флагов IF и TF, регистр FL), затем выполняет переход на ячейку ОЗУ с адресом 08H. Ячейки ОЗУ с 08H по 0BH инициализируется программой монитора после сброса и содержат адреса программ обработки прерывания монитора.

INTR – запрос внешнего прерывания. При разрешённых программой прерываниях, если NMI=0, а INTR=1, микропроцессор помещает в стек содержимое регистров CS, IP и FL, формирует флаг подтверждения прерывания и переходит к одной из 256 подпрограмм обслуживания прерываний. Адрес подпрограммы обслуживания прерываний задаётся байтом и передаётся в МП из интерфейса прерывающего устройства по сигналу . Пользователь имеет возможность сопрягать с микролабом дополнительные устройства и использовать сигнал INTR по своему усмотрению. Сигнал INTR подаётся на микропроцессор через инвертор.

(QS1) – подтверждение прерывания (состояние очереди команд). Сигналы QS0, QS1 формируются только в максимальном режиме и отражают состояние очереди команд согласно табл.2.

HOLD(RAVE0) – запрос прямого доступа к памяти (подтверждение доступа к магистрали). На вход HOLD от контроллера быстродействующего внешнего устройства поступает

QS1

QS0

Состояние очереди команд

0

0

Нет операции

0

1

Очередь очищается

1

0

Извлекается первый байт

1

1

Извлекается очередной байт

Таблица 2

сигнал запроса прямого доступа к памяти (ПДП). По окончании текущего цикла передачи по шине микропроцессор переводит буферные схемы шины ADO0 – ADO19 в третье состояние и формирует сигнал подтверждения режима ПДП HLDA, по которому управление шиной передаётся контроллеру внешнего устройства. По окончании сигнала HLDA МП продолжает выполнение текущей программы.

Сигнал HOLD выведен на разъём X 1.1 микролаба, находится в неактивном состоянии и при необходимости может быть использован по усмотрению. HOLD подаётся на МП через инвертор.

В максимальном режиме вместо сигналов HOLD и HLDA используются две двунаправленные линии RQVE i (i=0,1) – запрос шины/разрешение доступа, на которые работает специальная микросхема – арбитр шины.

HLDA(RQVE1) – подтверждение ПДП (подтверждение доступа к магистрали) (см. сигнал HOLD).

Для лучшего понимания возможностей МП К1810ВМ86 рассмотрим его программистскую модель (рис. 4. 5).

На рис. 4 представлены узлы микропроцессора, которые доступны программисту, т.е. могут быть адресованы в командах в явной или неявной форме, на рис. 5 - программно-недоступные узлы, наиболее существенные для процесса выполнения команд. Следует также иметь в виду, что при обработке данных микропроцессор может взаимодействовать с различными типами памяти. К ним относятся постоянная

15

0

15

0

15

0

Рис.4. Программно-доступные узлы

19

0

19

0

Рис.5. Программно-недоступные регистры

память стандартных программ и констант, оперативная память программ и данных, а также стековая память, которые доступны программисту. Стековая память (стек) представляет собой, совокупность последовательно пронумерованных ячеек памяти. Особенность работы со стеком состоит в том, что в ней реа­лизуется дисциплина "последний пришел - первый ушел", т.е. в первую очередь из стека считывается информация, которая была записана в него последней.

Кратко охарактеризуем программно-доступные узлы программистской модели МП.

Любая ячейка памяти МП К1810ВМ86 имеет два типа адресов: физический и логический. Физический адрес представляет собой 20-разрядное число, диапазон изменения которого в 16-ричной системе счисления определяется от 0 до FFFFFН. Здесь и в дальнейшем Н (НЕХ) - признак 16-ричной системы счисления. Весь обмен информацией между микропроцессором и памятью осуществляется с использованием физических адресов.

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

Логический адрес состоит из двух составных частей: значения базы сегмента и значения смещения в сегменте (эффективного адреса). Эти компоненты отражаются 16-разрядными числами и используются для того, чтобы сформировать физический адрес. Под сегментом понимается непрерывная область памяти длиной в 64 Кбайт с последовательно нарастающими адресами. Если значение базы сегмента сдвинуть на 4 двоичных разряда влево, то получим физический адрес начала сегмента. А смещение в сегменте - это расстояние от начала сегмента до искомого адреса памяти. Таким образом, формирование физического адреса из логического происходит по следующему принципу: значение базы сегмента в двоичной системе счисления смещается на 4 разряда влево или на 1 разряд влево в 16-ричной системе счисления, и полученное 20-разрядное двоичное число (с четырьмя нулями в младших разрядах) складывается со значением смещения в сегменте. Допустим, что имеются значение базы DСВАН, значение смещения 4321Н, тогда физический адрес ячейки памяти вычисляется следующим образом: DСВАО + 4321 = ЕОЕС1.

Сегменты в программах задаются произвольно по усмотрению программиста и могут пересекаться в адресном пространстве. Для указания начальных адресов сегментов в зависимости от информации, для хранения которой предназначен сегмент (команды, стек, данные), используются регистры СS, SS, DS, ES. Программным путем регистры могут загружаться новой информацией. Таким образом, в памяти могут быть обозначены новые сегменты. Регистр CS (Code Segment ) определяет сегмент текущего кода - область памяти, в которой содержатся коды команд программы. В регистре DS (Date Segment) хранится начальный адрес сегмента текущих данных. Под данными понимается информация, необходимая для работы программы, например, массив чисел. Сегмент текущего значения стека определяется регистром SS (Stake Segment). ES (Extra Segment) используется для хранения адреса дополнительного сегмента.

Значения смещений в сегменте задаются через указатели (SP, BP) и индексные регистры (SI, BI). В регистрах-указателях SP (Stack Pointer) и BP (Base Pointer) обычно записывается адресное смещение по отношению к стековому сегменту, а в индексных регистрах - адресное смещение по отношению к сегменту данных. Смещение в сегменте текущего кода задается в регистре IP (Instruction Pointer). IP содержит, относительно содержимого CS, смещение очередной команды, подлежащей выполнению. SР - это указатель стека, IР - счетчик команд (РС).

Следует отметить, что стек в МП К1810ВМ86 растет в направлении меньших адресов памяти, т.е. при записи в стек содержимое SР уменьшается на 2, при считывании из стека - увеличивается на 2. При этом содержимое регистра SS не изменяется. Все стековые операции обрабатывают слова данных. Один байт не может быть помещен в стек либо извлечен из него.

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

Блок регистров общего назначения составлен из четырех 16-разрядных регистров А, В, С, D. Эти регистры могут использоваться как 16-разрядные ( тогда к их наименованию прибавляется символ X) и как 8-разрядные. В последнем случае каждый регистр разбивается на два 8-разрядных, и к его наименованию дописывается символ L, если это правый байт, или Н в случае левого (рис. 4 ). Все регистры могут быть использованы при выполнении арифметических и логических команд. Однако есть ряд команд (например, команды работы с массивами данных), использующих определенные регистры для специфических целей. Отсюда названия А (Аccumulator) аккумулятор, В (Ваsе) - база, С (Соunt ) - счет, D (Date ) - данные.).

Регистр признаков (флагов) F (Flag) служит для отоб­ражения особенностей результата операции и содержит шесть флагов, показывающих состояние процессора после выполнения очередной арифметической или логической команды ( С, Р, А, Z, S, O), и три флаговых разряда для управления работой МП (D, I ,T).

С (Саггу) - признак переноса, устанавливается в 1, если в результате выполнения команды осуществляется перенос из старшего разряда. В разряд признака четности P (Parity) записывается 1, если при выполнении команды количество единиц в разрядах результата будет четным. Четность обычно используется для контроля хранимых значений при тестировании памяти.

Если при выполнении операции имел место перенос из 3-го разряда, то формируется признак вспомогательного переноса АС (Аuхiliary Сarry). Этот флаг позволяет МП реализовывать команды десятичной арифметики.

В разряд нулевого признака Z (Zero) записывается 1, если при выполнении команды результат равен нулю.

Пятнадцатый разряд числа - его знак: единица указывает на отрицательное число, 0 - на положительное. Соответствующим образом формируется и признак знака S ( Sing).

Если результат выполнения арифметических операций превышает разрядность МП, то устанавливается в 1 признак переполнения О(Overflow).

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

Флаг направления D (Direction) используется лишь при обработке последовательности элементов цепочки данных. При D=0 последовательность адресов обрабатываемых данных формируется в порядке их нарастания, а при D = 1 - в порядке убывания адресов.

Признак прерывания I (Interrupt) определяет для МП возможность реагировать, на внешние прерывания. При I=0 сигнал запроса прерывания игнорируется.

Флаг захвата Т (Тгар) устанавливает для МП пошаговый режим работы программы, т.е., если Т = 1, то после выполнения каждой команды программы МП приостанавливает свою работу. Режим широко используется при отладке программ.

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

Существует понятие длины команды. Единицей измерения длины команды обычно является байт (8 битов). В МП К1810ВМ86 команды могут иметь длину от 1 до 6 байт. Каждый байт команды имеет свою структуру. В связи с этим вводится понятие "формат команды", который определяет длину команды и назначение различных полей.

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

Стандартные форматы команд приведены на рис.6. Штриховыми линиями обозначены необязательные байты команды. Первый байт команды содержит код операции и два однобитовых поля: направления d и слова w. При d = 1 осуществляется передача операнда или результата операции в регистр, который определяется полем rеg второго байта команды, при d = 0 - передача из указанного регистра. Поле w идентифицирует разрядность операндов: при w = 1 команда оперирует словом, при w =о - байтом.

Второй байт, называемый постбайтом, определяет участвующие в операции регистры или регистр и ячейку памяти. Постбайт состоит из трех полей: md - режим, rеg - регистр, r/m - регистр/память. Поле rеg определяет операнд, который обязательно находится в регистре МП и условно считается вторым

a

= =

d

w

md

reg

r /m

disp L

disp H

)

б)

= =

s

w

md

= =

r/m

dispL

dispH

datL

datH

= =

- поле кода операции

- поле, которое может отсутствовать

Рис. 6. Варианты стандартных форматов команд

Таблица 3

reg, reg,

r/m w=0 w=1 r/m w=0 w=1

000 AL AX 100 AH SP

001 CL CX 101 CH BP

010 DL DX 110 DH SI

011 BL BX 111 BH DI

операндом. Поле r/m определяет операнд, который может находиться в регистре или памяти и условно считается первым. Способ кодирования внутренних регистров МП в полях rеg и r/m представлен в табл. 3.

Отметим, что поле rеg используется для указания регистра только в двухоперандных командах. Если в команде присутствует один операнд, то он идентифицируется полем r/m, и поле rеg используется для расширения кода операции.

Поле md показывает, как интерпретируется поле r/m для нахождения первого операнда: если md =11, то операнд содержится в регистре, в остальных случаях - в памяти. Когда адресуется память, то поле md определяет вариант использования смещения disp, находящегося в третьем и четвертом байтах команды (табл. 4).

При md = 11 реализуется косвенная адресация памяти, и поле r/m определяет правила формирования эффективного адреса ЕА операнда в соответствии с табл. 5, где disp означает смещение, заданное в формате команды.

Приведенные в табл.5 правила имеют одно исключение, позволяющее реализовать прямую (абсолютную) адресацию: если md = 00 и r/m = 110 , то EA = disp H , disp L. Таким образом, имеется три варианта интерпретации поля md и восемь вариантов интерпретации поля r/m, что дает 24 варианта вычисления эффективного адреса ЕА. Суммарные сведения о вычислении физического адреса приведены в табл.5.

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

На рис. 6, б приведен формат команды с непосредственным операнд ( datH datL ). Бит направления d отсутствует, так как результат операции можно поместить только на место первого операнда. Место этого бита занимает s, который является признаком использования одного байта для задания непосредственного операнда при работе со словами. Поля s и w интерпретируются в соответствии с табл.6.

Таблица 4

Поле Эффективный

r/m адрес EA

Адресация

000 BX+SI+disp

Базово-индексная

001 BX+DI+disp

010 BP+SI+disp

011 BX+DI+disp

100 SI+disp

Индексная

101 DI+disp

110 BP+disp

Базовая

111 BX+disp

Таблица 5

Поле Поле md

r/m

00 01 10

11

000 BX+SI BX+SI+D8 BX+SI+D16 AL AX

001 BX+DI BX+DI+D8 BX+DI+D16 CL CX

010 BP+SI BP+SI+D8 BP+SI+D16 DL DX

011 BP+DI BP+DI+D8 BP+DI+D16 BL BX

100 SI SI+D8 SI+D16 AH SP

101 DI DI+D8 DI+D16 CH BP

110 D16 BP+D8 BP+D16 DH SI

111 BX BX+D8 BX+D16 BH DI

Примечание: D8=disp L (однобайтное смещение);

D16=disp H disp L (двухбайтовое смещение).

Таблица 6

sw

Пояснения

X0

Один байт данных datL

01

Два байта данных datH, datL

11

Один байт данных, который автоматически расширяется со знаком до 16 бит

При выполнении многих команд микропроцессор осуществляет операции над данными (операндами), которые могут располагаться в регистрах самого микропроцессора, в различных типах памяти, в регистрах портов ввода-вывода. Тип обращения (адресации) к данным принято называть способом адресации. МП К1810ВМ86 обеспечивает 9 способов адресации, что упрощает организацию и использование сложных структур данных, а также расширяет возможности отдельных команд и повышает гибкость их применения. Рассмотрим кратко эти способы.

При регистровой адресации операнды находятся во внутренних регистрах микропроцессора. Регистры могут быть определены в байте кода операции или в постбайте, в котором выделены трехбитовые поля reg и r/m (при md=11). Команды, оперирующие содержимым регистров, являются наиболее короткими и выполняются за наименьшее время, так как не требуют вычисления эффективного адреса ЕА и выполнения цикла шины для обращения к памяти.

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

1) Арифметическое сложение содержимого регистра АХ с содержимым ВХ. Результат засылается в аккумулятор: АХ(АХ)+(ВХ).

03 АDD AX, BX

С3

2) Операция декрементирования содержимого регистра SI: SI(SI)-1.

4E DEC SI

3) Засылка содержимого аккумулятора в сегментный регистр DS.

8E MOV DS, AX

D8

Непосредственная адресация считается наиболее простым и быстрым способом обращения к данным.

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

Численные константы в ассемблере МП К1810ВМ86 допускаются в системах счисления с основаниями 2, 8, 10 и 16. За младшей цифрой должен находиться однобуквенный дескриптор системы счисления: В – двоичная; О или Q - восьмеричная; D (необязательно) – десятичная; Н - шестнадцатеричная. В последнем случае число, начинающееся с «буквенной цифры» А-F, должно быть дополнено слева незначащим нулем.

При разработке программ следует иметь в виду, что в микропроцессоре 1810ВМ86 отсутствуют команды непосредственной загрузки сегментных регистров и включения константы в стек. Поэтому эти операции осуществляются с помощью промежуточной загрузки регистра общего назначения или ячейки памяти.

Рассмотрим примеры команд с непосредственной адресацией

1) Засылка непосредственного операнда 2 в аккумулятор: AX2H.

В8 MOV AX, 2

02

2) Операция исключающего ИЛИ (сложения по модулю 2) над содержимым байтового регистра AL и константой EFH, результат записывается в регистр AL: AL(AL)EFH.

  1. XOR AL, 0EFH

EF

3) Установка флагов регистра признаков по результату выполнения операции логического умножения над содержимым AX и непосредственным операндом 2: (AL)2. Результат записывается в регистр AL.

A9 TEST AX, 02

02

Прямая адресация характеризуется тем, что эффективным адресом ЕА является содержимое байтов смещения команды. В командах преобразования данных этот способ реализуется при использовании постбайта с полями md = 00 и r/m = 110. Для некоторых команд предусмотрен укороченный формат.

Разновидностью этого способа является длинная прямая адресация, при которой в формате команды содержится четыре байта, указывающие базовый адрес сегмента и сегментное смещение offset. Длинная прямая адресация применяется только в командах межсегментных переходов и вызовов подпрограмм. Она обеспечивает доступ к ячейке памяти с любым логическим адресом, в пространстве 1Мбайт.

Другая разновидность прямой адресации используется для указания портов ввода-вывода в двухбайтовых командах IN, OUT. Второй байт этих команд содержит адрес (номер) порта.

Рассмотрим примеры команд с прямой адресацией.

1) Операция логического сложения над содержимым регистра DX и ячейки памяти с эффективным адресом 2000Н. Результат операции записывается в DX: DX(DX)(EXW).

0B OR DX, EXW

16

00

20

2) Межсегментный вызов подпрограммы SUBR. При осуществлении этого вызова в сегментный регистр CS заносится адрес 6000Н, в указатель IP – адрес 2000Н: CS6000H, IP2000H.

9A CALL SUBR

00

20

00

60

3) Запись в порт с адресом 21Н содержимого регистра AL: 21H(AL).

E6 OUT AL, 21H

21

Косвенная регистровая адресация используется при необходимости многократного обращения к какой-либо ячейки памяти. В этом случае эффективный адрес ЕА равен содержимому одного из регистров SI, DI, BX и BP при соответствующем кодировании полей md и reg постбайта: md=00; r/m=100, 101, 111 и md=01; r/m=110; dispL=0. В командах безусловного перехода и вызова подпрограммы с регистровой косвенной адресацией допускается указание любого 16-битового регистра общего назначения (md=11; r/m=000,…,110, 111).

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

Разновидностью этого способа адресации является косвенное обращение к портам ввода-вывода с помощью содержимого регистра DX в однобайтовых командах ввода-вывода IN и OUT.

Рассмотрим примеры команд косвенной регистровой адресации.

1) Близкий косвенный вызов подпрограммы, адрес которой содержится в ячейке INDIR. Смещение ячейки памяти, помеченной меткой INDIR, содержится в двух последних байтах команды. Запись INDIR DW 2000 определяет адрес вызываемой подпрограммы.

INDIR DW 2000

FF CALL INDIR

16

00

11

2) Ввод данных из порта, адрес которого содержится в регистре DX, в регистр AX: AL(DX).

EC IN AL, DX

При базовой адресации эффективный адрес операнда ЕА вычисляется путём суммирования содержимого базовых регистров BX или BP и смещения disp (md=01, 10; r/m=110, 111). При использовании BX происходит обращение к операнду в текущем сегменте данных, а при использовании BP – в текущем сегменте стека. Смещения, которые содержаться в команде, могут иметь длину 8 или 16 бит и интерпретируются как знаковые целые числа, представленные в дополнительном коде.

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

Операнд базовой адресации можно записать по-разному:

INC [BP +DT] ; DT – смещение

INC [DT] + [BP]

INC [BP].DT

INC DT[BP]

Рассмотрим примеры команд базовой адресации.

1) Загрузка в индексный регистр содержимого ячейки памяти, адрес которой определяется как сумма содержимого регистра BP и смещения, равного 6: SI[(BP)+6].

8B MOV SI, [BP+6]

76

06

2) Сравнение содержимого аккумулятора и содержимого ячейки памяти, адрес которой определяется как (BX)+14 (смещение DT=14 и определяется третьим байтом команды). Сравнение происходит путем операции вычитания (AX)-((BX)+14). Результат вычитания никуда не записывается. Устанавливаются только флаги регистра признаков.

3B CMP AX, [BX].DT

47

14

При индексной адресации значение эффективного адреса ЕА вычисляется как сумма смещения disp, находящегося в команде, и содержимого индексного регистра SI или DI (md=01,10; r/m=100, 101). Данный способ обычно применяется для обращения к различным элементам одномерного массива (таблицы) данных, когда смещение определяет известный при ассемблировании начальный адрес массива, а индексный регистр, содержимого которого может изменяться при выполнении программы, определяет элемент массива.

Операнд индексной адресации можно записать различным образом по аналогии с базовой адресацией (см. выше).

Рассмотрим примеры команд индексной адресации.

1) Сложение содержимого регистра AL и содержимого ячейки памяти, адрес которой определяется как сумма содержимого регистра DI и смещения DT, равного 10Н.

00 ADD [DI]. DT, AL

45

10

2) Засылка содержимого ячейки памяти, адрес которой определяется суммой содержимого регистра DI и смещения, равного 0ABH.

8A MOV CX, [DI+0ABH]

4D

AB

Базовая индексная адресация определяет эффективный адрес ЕА как сумму содержимого базового регистра BX или BP, индексного регистра SI или DI и смещения disp, находящегося в команде (в частном случае смещение может отсутствовать). Этот способ адресации наиболее гибкий, так как два компонента можно определить и варьировать ими при выполнении программы. Это удобно использовать при обращении к элементам многомерных массивов, в особенности двумерных матриц.

Базовая индексная адресация реализуется при следующем кодировании полей: md11, 10; r/m=000, 001, 010, 011.

В рассматриваемых примерах приведены различные варианты представления операнда базовой индексной адресации.

1) Запись содержимого верхней ячейки стека в ячейку памяти, адрес которой вычисляется как (ВХ)+(DI)+DT. После выполнения операции указатель стека увеличивается на 2. Величина смещения DТ определяется в двух последних байтах и составляет 100Н.

8F POP [DT+BX+DI]

81

00

01

2) Запись в регистр CX содержимого ячейки памяти, адрес которой определяется как (BP)+(SI)+DT. Величина смещения составляет 100Н.

8В MOV CX, DT[BP][SI]

89

00

01

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

Рассмотрим примеры команд относительной адресации.

1) Передача управления на метку CLOS с эффективным адресом (IP)+7 в случае, если результат предыдущей операции равен 0.

74 JZ CLOS

07

2) Безусловный переход на метку SUBR, эффективный адрес которой вычисляется как (IP)+100H.

EB JMP SUBR

00

01

В кодах команд неявной адресации операнд указывается с помощью первого байта команды вместе с кодом операции без выделения специального поля для этой цели. Чаще всего этот способ адресации встречается в однобайтных командах, где адресуемым объектом является аккумулятор, регистр флагов или отдельные флаги. В частности, в командах обработки цепочек неявно используются индексные регистры: регистр SI адресует первый элемент цепочки-источника, а регистр DI – первый элемент цепочки-получателя.

Рассмотрим примеры команд неявной адресации.

1) Пустая операция, используемая для реализации программной задержки.

90 NOP

2) Установка флага переноса: С1.

F9 STS

Следует отметить, что в двухоперандных командах термин “способ адресации” употребляется относительно операнда команды. Например, в команде ADD BETA, OFFH мы имеем непосредственный операнд OFFH и операнд прямой адресации BETA.

Более подробную информацию о способах адресации, системе команд и их форматах можно найти в литературных источниках [3] – [6].