- •Организация эвм и систем
- •Глава 1 эвм общего назначения
- •Структура эвм общего назначения.
- •Арифметико-логические устройства.
- •Устройства управления.
- •Risc и cisc процессоры.
- •1.5 Форматы машинных команд.
- •Inc byte ptr [40h] – одноадресная
- •Способы адресации.
- •Стековая адресация. Виды стеков.
- •Глава 2
- •2.1 Микропроцессор к1810вм86.
- •2.2 Назначение входов/выходов вм86 в минимальном режиме.
- •2.3 Назначение входов/выходов вм86 в максимальном режиме.
- •Внутренняя архитектура мп вм86.
- •Сегментация памяти.
- •2.6 Программная модель мп вм86.
- •2.7 Организация оперативной памяти.
- •2.8 Организация адресного пространства портов ву.
- •2.9 Методы обмена информацией между мп и портами ву.
- •2.10 Параллельный программируемый адаптер к1810вв55 (i8255).
- •Пример использования и программирования адаптера
- •2.12 Программируемый таймер к1810ви54 (i8254).
- •2.13 Пример использования таймера.
- •2.14 Обработка прерываний.
- •2.15 Система прерываний вм86.
- •2.16 Контроллер прерываний к1810вн59 (i8259).
- •Дополнительная информация о настройке вн59.
- •Прямой доступ к памяти.
- •Программирование кпдп вт37
- •2.21 Организация процессорного модуля вм86.
- •2.20. Организация шинного интерфейса в максимальном режиме
- •2.23. Слабо связанные конфигурации.
- •2.24. Арбитр шин к1810вб89 (i8289).
- •2.25 Сильно связанные конфигурации на примере совместной работы мп86 и арифметического сопроцессора вм87.
- •2.26. Формат машинной команды вм86.
2.6 Программная модель мп вм86.
Программная модель ВМ86 представлена на рис. 6. Все регистры ВМ86 можно разбить на группы. Первую группу составляют РОНы, к которым относятся регистры ax, bx, cx и dx. Любой из этих регистров можно рассматриваться и как один шестнадцатиразрядный, и как пара восьмиразрядных регистров. Основное назначение РОНов – временное хранение информации, однако, на каждый из этих регистров в ВМ86 возлагается и ряд специальных функций.
Регистр ax – в нем формируется результат (или его часть) в командах умножения и деления. Кроме того обмен информацией между МП и портами ВУ можно проводить только через регистры ax и al. То есть допустимы команды
out 20h,al и in ax,70h
и недопустимы
out 20h,ah и in bx,70h.
Регистр bx - первый базовый регистр процессора. Это единственный регистр из группы РОНов, который можно использовать для косвенной и базовой адресации. То есть допустимы команды
mov al,[bx] и add [bx +7],dx
и недопустимы
mov al,[ax] и add [bh +7],dx.
Если для адресации используется регистр bx, то, по умолчанию, в качестве сегментного регистра берется регистр ds.
Регистр cx используется в качестве счетчика в команде цикла loop и командах, перед которыми поставлен префикс повторения rep. То есть цикл или команда с префиксом будет повторяться до тех пор, пока сх не обнулится (естественно, после каждого прохода содержимое сх автоматически уменьшается). Кроме того регистр cl используется в командах сдвига для задания числа сдвигов.
Рис. 6
Регистр dx – это единственный регистр МП, который можно использовать для косвенной адресации портов ВУ. То есть допустимы команды
out [dx],ax и in al,[dx].
Регистры bp, sp, si и di составляют группу регистров указателей. Основное их назначение – участвовать в формировании Аэф. Однако если для этой цели они не нужны, их можно использовать в качестве РОНов . Регистры этой группы могут быть только шестнадцатиразрядными.
Регистр bp - второй базовый регистр процессора. Если для адресации используется регистр bp, то, по умолчанию, в качестве сегментного берется регистр ss. Таким образом, использование для адресации регистра bp позволяет обращаться к области стека, как к обычной памяти.
Регистры si и di – индексные регистры процессора. Используются для косвенной и базово-индексной адресации. При этом необходимо соблюдать следующее правило: в любой команде для адресации можно использовать только один базовый и только один индексный регистр. То есть допустимы команды
sub [di],7 и mov cx,[bp + si +7]
и недопустимы
mov [bx+bp],al и mov dh,[si + di].
Регистр sp – указатель стека. Использовать его в качестве РОНа не рекомендуется.
Регистр ip не относится ни к какой группе и называется указателем команд. По своей сути – это программный счетчик. В нем всегда формируется смещение в кодовом сегменте и, таким образом, ip всегда задает адрес следующей команды программы. Сменить содержимое ip можно только командами перехода, то есть командами jmp, call, ret и др.
Регистры cs, ss, ds и es составляют группу сегментных регистров.
Регистр cs всегда используется вместе с регистром ip при формировании адреса следующей команды программы. Данный адрес формируется следующим образом:
Аф = (cs)×16 + (ip).
То есть содержимое cs задает начальный адрес сегмента кода.
Сегментный регистр ss задает начальный адрес сегмента стека и всегда используется вместе с регистром sp для формирования Аф при обращении к стеку:
Аф = (ss)×16 + (sp).
Содержимое сегментного регистра ds задает начальный адрес сегмента данных. В командах, оперирующих с данными, при формировании физического адреса ОП в качестве сегментного регистра по умолчанию (кроме случая, когда в качестве базового используется регистр bp) берется ds. Однако при этом мы всегда имеем возможность сменить сегмент, прямо указав сегментный регистр, который должен использоваться для формирования Аф, с помощью префикса замены сегмента. Например:
mov [bx],ax
Аф = (ds)×16 + (bx);
mov ss:[bx],ax
Аф = (ss)×16 + (bx).
Содержимое сегментного регистра es задает начальный адрес дополнительного сегмента. По умолчанию этот регистр используется только при формировании физического адреса приемника в строковых командах. В остальных случаях использование es задается с помощью префикса замены сегмента.
В таблице 3 показаны все возможные случаи формирования Аф и компоненты, принимающие участие в этом процессе
Регистр f – регистр флагов. Его формат приведен на рис. 7. В этом регистре определены следующие флаги:
cf (carry) – флаг переноса. Этот флаг устанавливается в единицу, если в процессе операции возникает перенос из старшего разряда (или был заем в старший разряд при вычитании). С этим флагом работают некоторые команды условных переходов. Программист может непосредственно влиять на значение этого флага, используя команды stc, clc и cmc (установить , сбросить, инвертировать).
pf (parity)– флаг четности. Устанавливается в единицу, если в младшем байте результата получилось четное число единиц. Флаг можно использовать для организации «контроля по четности», с ним работают некоторые команды условных переходов.
af (adjust) – флаг межтетрадного переноса. Устанавливается в единицу, если в процессе операции возникает перенос из 3-го бита в 4-й (или при заеме из 4-го бита при вычитании). С флагом работают команды коррекции для двоично-десятичной (BCD) арифметики.
Таблица 3
Вид операции |
Сегментный регистр по умолчанию |
Возможность смены сегментного регистра с помощью префикса |
Внутрисегментное смещениие |
Выборка команды |
cs |
нет |
ip |
Стековая операция |
ss |
нет |
sp |
Обращение к памяти (кроме bp в качестве базового регистра) |
ds |
cs, ss, es |
Аэф |
Обращение к памяти при bp в качестве базового регистра |
ss |
cs, ds, es |
Аэф |
Источник в строковой команде |
ds |
cs, ss, es |
si |
Приемник в строковой команде |
es |
нет |
di |
Обращение к ВУ |
нет |
нет |
dx или прямая адресация |
Рис. 7
zf (zero) – флаг нулевого результата. Устанавливается в единицу, если результат операции оказался равен нулю. С флагом работают некоторые команды условных переходов.
sf (sign)– флаг знака. Устанавливается в единицу, если в старшем разряде результата получилась единица, то есть результат является отрицательным числом. С флагом работают некоторые команды условных переходов.
of (overflow)– флаг переполнения. Устанавливается в единицу, если в результате выполнения арифметической операции произошло переполнение разрядной сетки. С флагом работает единственная команда into – «прерывание, если установлен флаг of».
tf (trap)– флаг трассировки. Если этот флаг установлен в единицу, программа выполняется в «пошаговом режиме», так как после каждой команды МП автоматически генерирует прерывание типа 1. Таким образом этот флаг используется для отладки. У программиста нет в распоряжении команд, влияющих на этот флаг. Поэтому изменить значение флага tf можно только косвенным образом, через стек. Например, следующий фрагмент программы сбрасывает tf в ноль:
pushf
mov bp,sp
and [bp],0feffh
popf
if (interrupt enable)– флаг разрешения внешних прерываний. Если этот флаг установлен в ноль МП игнорирует запросы на прерывание, приходящие на вход INTR. Для работы с этим флагом есть две команды:
sti - if ← 1 – разрешить внешние прерывания;
cli - if ← 0 – запретить внешние прерывания.
df (direction)– флаг направления, задает автоинкремент или автодекремент регистров si и di в строковых командах. Программист имеет возможность влиять на этот флаг с помощью команд std и cld.