Лекции по Вычислительным машинам, системам и сетям   

2. Микропроцессорный комплект К1810

2.6. Программная модель МП ВМ86

Программная модель ВМ86 представлена на рис. 2.3. Все регистры ВМ86 можно разбить на группы. Первую группу составляют регистры общего назначения (РОН), к которым относятся регистры ax, bx, cx и dx. Любой из этих регистров можно рассматривать и как один шестнадцатиразрядный, и как пару восьмиразрядных регистров. Основное назначение РОН – временное хранение информации, однако на каждый из этих регистров в ВМ86 возлагается и ряд специальных функций.

 

15           8

7             0

 

15                            0

ax

ah

al

 

f

cx

ch

cl

 

ip

dx

dh

dl

   

bx

bh

bl

   
 

sp

 

cs

 

bp

 

ds

 

si

 

ss

 

di

 

es

Рис. 2.3

В регистре 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 используется в командах сдвига для задания числа сдвигов.

Регистр 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 задается с помощью префикса замены сегмента. В табл. 2.3 показаны все возможные случаи формирования Аф и компоненты, принимающие участие в этом процессе.

Таблица 2.3

Вид операции

Сегментный регистр по умолчанию

Возможность смены сегментного регистра с помощью префикса

Внутри-сегментное смещениие

Выборка команды

cs

нет

ip

Стековая операция

ss

нет

Sp

Обращение к памяти (кроме bp в качестве базового регистра)

ds

cs, ss, es

Аэф

Обращение к памяти при bp в качестве базового регистра

ss

cs, ds, es

Аэф

Источник в строковой команде

ds

cs, ss, es

Si

Приемник в строковой команде

es

нет

Di

Обращение к ВУ

нет

нет

dx или прямая адресация

Регистр f – регистр флагов. Его формат приведен на рис. 2.4. В этом регистре определены следующие флаги:

cf (carry) – флаг переноса. Этот флаг устанавливается в единицу, если в процессе операции возникает перенос из старшего разряда (или был заем в старший разряд при вычитании). С этим флагом работают некоторые команды условных переходов. Программист может непосредственно влиять на значение этого флага, используя команды stc, clc и cmc (установить, сбросить, инвертировать).

15

   

12

11

                   

0

резерв

of

df

if

tf

sf

zf

-

af

-

pf

-

cf

Рис. 2.4

pf (parity) – флаг четности. Устанавливается в единицу, если в младшем байте результата получилось четное число единиц. Флаг можно использовать для организации «контроля по четности», с ним работают некоторые команды условных переходов.

af (adjust) – флаг межтетрадного переноса. Устанавли-вается в единицу, если в процессе операции возникает перенос из 3-го бита в 4-й (или при займе из 4-го бита при вычитании). С флагом работают команды коррекции для двоично-десятичной (BCD) арифметики.

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.



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.