Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТСвИС / (х) учебное пособие. организация Компьютеров и Систем.doc
Скачиваний:
83
Добавлен:
28.05.2015
Размер:
1.15 Mб
Скачать

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 - if1разрешить внешние прерывания;

cli - if0запретить внешние прерывания.

df (direction)– флаг направления, задает автоинкремент или автодекремент регистров si и di в строковых командах. Программист имеет возможность влиять на этот флаг с помощью команд std и cld.