Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лекции по ВМСС - файл 1.doc


Лекции по ВМСС
скачать (2871.5 kb.)

Доступные файлы (1):

1.doc2872kb.30.11.2011 08:40скачать

содержание
Загрузка...

1.doc

  1   2   3   4   5   6   7   8   9   10   11
Реклама MarketGid:
Загрузка...
Ф.В.Филиппов

ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ

УЧЕБНОЕ ПОСОБИЕ
Санкт - Петербург

2008

УДК 004(07)


Вычислительные машины, системы и сети: учебное пособие / сост.

Ф. В. Филиппов - СПб.: Изд-во СЗТУ, 2008. - 197 с.

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

220201.65 - Управление и информатика в технических системах

140211.65 - Электроснабжение
Направления подготовки бакалавра

220200.62 - Автоматизация и управление

Санкт - Петербург

Издательство СЗТУ

2008

Оглавление




2

Оглавление 3

Введение 5

Раздел 1. Центральный процессор 6

1.1. Архитектура центрального процессора 6

1.2. Организация памяти и способы адресации 11

1.3. Общая характеристика системы команд 19

1.4. Команды пересылки данных 20

1.5. Арифметические команды 22

1.6. Сдвиги и логические команды 25

1.7. Команды обработки строк данных 26

1.8. Команды передачи управления 28

1.9. Команды управления процессором 32


Раздел 2. Арифметический процессор 36

2.1. Архитектура арифметического процессора 36

2.2. Программная модель арифметического процессора 40

2.3. Система команд арифметического процессора 46

Раздел 3. Эволюция характеристик ЦП 57

3.1. Архитектура ЦП Pentium 57

3.2. Программная модель ЦП Pentium 61

3.3. Система команд ММХ-расширения 63

3.4. Система команд SSE-расширения 68

Раздел 4. Системные устройства ВМ 77

4.1. Программируемый контроллер прерываний 77

4.2. Программируемый контроллер ПДП 81

4.3. Системный таймер 86

4.4. Системные регистры 89

Раздел 5. Защищенный режим работы ВМ 93

5.1. Максимальный режим работы ЦП 93

5.2. Дескрипторы и шлюзы 98

Раздел 6. Язык ассемблера 104

6.1. Программирование на языке ассемблера 104

6.2. Директивы языка ассемблера ASM-86 107

6.3. Использование регистров Pentium 110

6.4. Директивы языка ассемблера ASM-89 112

6.5. Модели программ, компиляция и отладка 115

Раздел 7. Специфика вычислительных систем 118

7.1. Мультипроцессорные системы 118

7.2. Управление процессами 123

7.3. Семафорные операции 128

7.4. Разделение общих процедур 131

7.5. Управление памятью 133

Раздел 8. Специализированные процессоры и ВМ 137

8.1. Процессор ввода-вывода 137

8.2. Программная модель процессора ввода-вывода 140

8.3. Система команд процессора ввода-вывода 147

8.4. Процессор операционной системы 155

Раздел 9. Назначение и топология сетей 160

9.1. Особенности и назначение сетей различных типов 160

Топология «звезда». 161

9.2. Кодирование информации 164

9.3. Назначение и структура пакетов 166

9.4. Методы управления обменом 169

9.5. Эталонные модели 172

Раздел 10. Практическая реализация сетей 178

10.1. Адресация в сетях 178

10.2. Основные службы Internet 180

10.3. Особенности web-дизайна 182

10.4. Особенности и тенденции развития Internet 185

Глоссарий 188

Литература 198


Введение


В настоящее время вычислительные машины (ВМ) настолько широко используются во всех сферах человеческой деятельности, что знание в той или иной мере основ их строения и функционирования необходимо каждому образованному человеку. Применительно к специальности 220201.65 «Управление и информатика в технических системах» это знание должно быть весьма глубоким. Управление и информатика предполагает широкое использование различных вычислительных систем (ВС), построенных как на базе ВМ общего назначения, так и с использованием специализированных процессоров.

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

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

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

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

В заключение автор благодарит рецензентов и редакторов за внимательное прочтение рукописи и замечания, способствовавшие улучшению качества предлагаемого пособия.
^

Раздел 1. Центральный процессор

1.1. Архитектура центрального процессора


Существует много различных подходов к реализации структурной схемы (архитектуры) центрального процессора (ЦП). В нашей стране наибольшее распространение получила архитектура, предложенная американской фирмой Intel. Именно поэтому мы сосредоточим основное внимание на изучении процессоров, построенных по идеологии Intel и вычислительных машин, реализованных на базе этих процессоров фирмой IBM. Начнем с первого 16-разрядного процессора Intel 8086, разработанного еще в 1978 году и послужившего основой для разработки многих поколений ЦП, вплоть до Pentium 4.

При разработке Intel 8086 применены интересные архитектурные реше­ния, к которым, в частности, относится разделение функций сопряжения с шиной и выполнения команд. В соответствии с этим структуру процессора (рис. 1.1, а) можно условно разделить на две части: блок сопряжения с шиной (БСШ) и исполнительный блок (ИБ). Блок сопряжения с шиной БСШ обеспечивает функции, связанные с выборкой операндов и кодов команд из памяти, запоминанием операндов, установлением очередности команд, а также формированием адресов операндов и команд. Исполнительный блок ИБ получает команды из очереди команд и указывает адрес операнда для БСШ. Операнды из памяти поступают через БСШ на обработку в ИБ, который выполняет предписанные операции и возвращает результаты в память через БСШ. Важно подчеркнуть, что эти блоки работают параллельно, причем БСШ обеспечивает извлечение кодов команд заблаговременно, в то время как ИБ выполняет текущую команду. Это повышает пропускную способность мультиплексированной шины адреса/данных ША/Д и увеличивает быстродействие ЦП.

Рассмотрим назначение и работу отдельных узлов микропроцессора Intel 8086. В нем имеется четырнадцать 16-разрядных регистров, которые по своему назначению можно разделить на три группы (рис. 1.1, б). Регистры АХ, ВХ, СХ, DX образуют группу регистров общего назначения (РОН). Эти регистры могут без ограничений участвовать в выполнении арифметических и логических опера­ций. Некоторые другие операции, например операции над цепоч­ками байтов и слов, предписывают регистрам данной группы спе­циальное использование: АХ - аккумулятор, ВХ - база, СХ - счетчик, DX - данные. В отличие от регистров других групп РОН обладают свойством раздельной адресации старших и младших байтов. Поэтому РОН можно рассматривать как совокупность двух наборов 8-разрядных регистров: набора Н, содержащего АН, ВН, СН, DH, и набора L, содержащего AL, BL, CL, DL. Регистры всех других групп являются неделимыми и оперируют 16-разрядными словами, даже в случае использования только старшего или младшего байта.

Регистры SP, BP, SI и DI образуют группу указательных и индексных регистров, назначение которых заключается в том, что они содержат значения смещений, используемых для адресации в пределах текущего сегмента памяти. При этом регистры-указатели SP и ВР хранят смещения адреса в пределах текущего сегмента памяти, выделенного под стек, а индексные регистры SI и DI содержат смещения адреса в пределах текущего сегмен­та памяти, выделенного под данные. С этим связаны и обозна­чения регистров: SP - указатель стека, ВР - указатель базы, SI - индекс источника и DI - индекс места назначения. Регистры этой группы могут использоваться и как регистры общего назначения.

Регистры CS, DS, SS и ES, образующие группу сегментных регистров, играют важную роль во всех действиях ЦП, связан­ных с адресацией памяти. Обозначения регистров расшифровы­ваются следующим образом: CS - кодовый или программный сегмент, DS - сегмент данных, SS - стековый сегмент и ES - дополнительный сегмент. Содержимое любого из этих регистров определяет текущий начальный адрес сегмента памяти, выде­ленного пользователем под информацию, соответствующую на­званию регистра.

Содержимое регистра CS определяет начальный адрес сег­мента памяти, в котором располагается объектный код програм­мы. Выборка очередной команды осуществляется относительно содержимого CS с использованием значения указателя команд IP. Содержимое регистра DS определяет начальный адрес теку­щего сегмента данных, так что обращение к данным в памяти ЦП осуществляет относительно содержимого DS. Для обраще­ния к другим трем сегментам: дополнительному, стековому или программному - используется специальный указатель, который называется префиксом замены сегмента и располагается в соот­ветствующих командах.

Содержимое регистра SS определяет текущий сегмент, вы­деленный для организации стека. Все обращения к памяти, при которых для вычисления адреса прямо или косвенно использу­ются регистры ВР или SP, осуществляются относительно содер­жимого регистра SS. К таким обращениям относятся, напри­мер, все операции со стеком, включая и те, которые связаны с операциями вызова подпрограмм, прерываниями и операциями возврата. Обращения к данным, использующие регистр ВР (но не SP), могут производиться также и относительно одного из трех других сегментных регистров путем использования префик­са замены сегмента.



Рис. 1.1. Архитектура центрального процессора Intel 8086 и его регистры.
Содержимое регистра ES определяет начальный адрес сег­мента, рассматриваемого как дополнительный сегмент данных. В частности, обращения к данным в операциях с цепочками бай­тов или слов осуществляются относительно ES, а в качестве сме­щения берется содержимое DI.


Рис. 1.2. Регистр флагов

Кроме перечисленных регистров имеются два 16-разрядных регистра: IP - указатель команд и F - регистр флагов. В регист­ре IP формируется относительный (относительно CS) адрес команды, подлежащей исполнению. В регистре F (рис. 1.2) ис­пользуются следующие девять разрядов: CF - перенос, PF - четность, AF - вспомогательный перенос, ZF - нулевой резуль­тат, SF - знак, TF - пошаговый режим, IF - разрешение преры­вания, DF - направление, OF - переполнение. Неиспользован­ные разряды на рисунке заштрихованы.

Флаги AF, CF, PF, SF и ZF характеризуют признаки результата последней арифметической, логической или иной операции, влияющей на эти флаги. Установка флага производится в следующих случаях:

AF - при выполнении операции производится перенос «1» из младшей тетрады байта в старшую или осуществляется заем «1» из старшей тетрады;

CF - при переносе «1» из старшего бита байта (слова) или при заеме единицы в старший бит;

PF - если в представлении результата операции содержится четное число единиц;

SF - при получении «1» в старшем бите результата;

ZF - если в результате выполнения операции получено нуле­вое значение.

К этой группе флагов относится также флаг OF, который устанавливается при наличии переполне­ния в результате выполнения арифметических операций над чис­лами со знаком.

Флаги DF, IF и TF используются для управления работой процессора. Флаг DF управляет направлением обработки данных в операциях с цепочками байтов или слов. При DF=1 цепочка обрабатывается снизу вверх, т. е. происходит автоматическое уменьшение (автодекремент) адреса текущего элемента цепочки. При DF=0 цепочка обрабатывается сверху вниз, т. е. происходит автоматическое увеличение (автоинкремент) адреса.

Флаг IF предназначается для разрешения или запрещения (маскирования) внешних прерываний. При IF = 0 внешние пре­рывания запрещены, т. е. процессор не реагирует на их запросы.

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

Основные операции по обработке данных выполняются в арифметико-логическом устройстве (АЛУ), с которым связана схема коррекции результатов (СКР), используемая при работе с данными, представленными в двоично-десятичных кодах. Связь внутренних узлов ЦП с шиной ША/Д осуществляется через бу­фер шины БШ, состоящий из двунаправленных усилителей с тре­мя устойчивыми выходными состояниями.

Усовершенствование архитектуры Intel 8086 связано также с вве­дением в структуру микропроцессора специального сумматора (СМ) для вычисления адресов памяти.

Как отмечалось выше, разрядность адресов микропроцессора равна 20. Однако для упрощения операций хранения и пересылки адресной информации процессор манипулирует 16-разрядными логическими адресами, к которым относятся начальные (базо­вые) адреса сегментов памяти и значения смещений в этих сег­ментах. Логические адреса используются для вычисления 20-разрядных физических (абсолютных) адресов с помощью следующей процедуры. Содержимое каждого сегментного регист­ра рассматривается как 16 старших разрядов А19-А4 начально­го адреса соответствующего сегмента. Младшие разряды A3-А0 этого адреса всегда полагаются равными нулю и поэтому не за­поминаются в регистрах, а приписываются справа к старшим разрядам во время операции вычисления физических адресов. Эта операция выполняется сумматором адреса, расположенным в блоке БСШ, и состоит в сложении 20-разрядного началь­ного адреса сегмента с 16-разрядным смещением, которое допол­няется четырьмя старшими разрядами А19-А16, равными нулю, как показано на рис. 1.3. Сумматор адресов осуществляет, напри­мер, следующие вычисления: CS + IP - при выборке очередной команды, SS + SP - при обращении к стеку, DS + SI и ES + DI - при обработке строк, DS + EA- при обращении к запоминающе­му устройству с произвольной выборкой (ЕА - исполнитель­ный адрес, формирование кото­рого описано ниже).




Рис. 1.3. Вычисление физического 20-разрядного адреса

Поскольку младшие четыре разряда начального адреса лю­бого сегмента должны быть равны нулю, значения началь­ных адресов сегментов выбира­ются кратными 16. Наиболь­шая емкость памяти, отводи­мой под один сегмент, определяется максимальным значением 16-разрядного смещения и составляет 64К байт.



Рис 1.4. Пример размещения сегментов в памяти

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

1.2. Организация памяти и способы адресации


Важным моментом в изучении способов адресации является понятие логической и физической памяти. Как показано на рис. 1.5, память логически организуется в виде последовательности смежных байтов, которые образуют двухбайтовые слова, причем младшим байтам слов соответствуют меньшие значения адресов. Если многобайтовое слово записывается, как обычно, слева на­право, то в память байты записываются в обратном порядке. Память с таким порядком размещения информации в словах на­зывают памятью с «перевернутыми словами».

В ВМ на базе Intel 8086 первые байты слов могут иметь как четные, так и нечетные адреса в памяти. Если слово начинается с четного адреса, обращение к нему произойдет в одном цикле, в то время как обращение к слову с нечетным адресом младшего байта займет два цикла. Поэтому для сокращения времени выполнения программ целе­сообразно располагать слова в памяти так, чтобы их младшие байты имели четные адреса.


a)
Рис. 1.5. Логическая (а) и физическая (б) организа­ция памяти
В зависимости от типа команды операнд может представлять собой байт или слово и храниться в РОН или памяти. В боль­шинстве команд для адресации операндов используется специ­альный байт, который называется

постбайтом и размещается вслед за первым байтом, содержащим код операции.




Рис. 1.6. Структура постбайта
Пост­байт, структура которого представлена на рис. 1.6, указывает способ адресации одного или двух операндов и состоит из трех полей. Поля mod и rзадают местоположение одного операнда следующим образом: если mod=11, то операндом является содержимое регистра, двоичный код (номер) которого задается в 3-разрядном поле rв соответствии с табл. 1.1а.

Если тod=11, то в полях mod и rсодержится информация, согласно которой устанавливается один из способов адресации - прямая, косвенная регистровая, по базе, индексная и по базе с индексированием. Если для реализации выбранного способа ад­ресации требуется дополнительная адресная информация, то она указывается в одном или двух байтах в виде смещения disp, кото­рое следует непосредственно за постбайтом. Наличие или отсут­ствие смещения и его размерность определяются полем mod сле­дующим образом:

  • если mod = 00, то disp отсутствует;

  • если mod=01, то disp размерностью 1 байт указывается за постбайтом, причем перед использованием этого смещения при формировании исполнительного адреса ЕА оно расширяется со знаком до 16 разрядов (расширение со знаком подразумевает заполнение старшего байта значением знакового разряда, ука­занного в disp);

  • если mod=10, то за постбайтом следует 16-разрядное смеще­ние disp, рассматриваемое как число со знаком.



Код

в поле

r/m

Значение

исполнительного

адреса ЕА

000

(BX+SI)+disp

001

(BX+DI)+disp

010

(BP+SI)+disp

011

(BP+DI)+disp

100

(SI)+disp

101

(DI)+disp

110

(BP)+disp

111

(BX)+disp
Таблица 1.1б

Таблица 1.1а

Код

регистра

Регистр

16-разрядный

8-разрядный

000

AX

AL

001

CX

CL

010

DX

DL

011

BX

BL

100

SP

AH

101

BP

CH

110

SI

DH

111

DI

BH


Для каждой комбинации значений поля mod 00, 01 или 10 формирование исполнительного адреса ЕА определяется полем rв соответствии с табл. 1.1б. Исключение из описанных способов кодирования полей mod и rсоставляет случай mod=00, r/т=110, соответствующий EA = disp, причем disp- есть 16-разрядное смещение. Таким об­разом, при обращении к памяти имеется 24 варианта вычисления адреса ЕА, используемого в качестве смещения в сегменте при вычислении физического адреса.

а)

б)

в)

г)

д)

е)


Рис. 1.7. Форматы команд центрального процессора
Поле reg постбайта используется для адресации тогда, когда в команде задаются два операнда. В этом случае второй операнд всегда находится в регистре, код которого указывается в поле постбайта в соответствии с табл. 1.1. В командах, где требуется только один операнд, поле reg постбайта используется совместно с байтом кода операции (КОП) для увеличения вариантов коди­рования операций. Всего в ЦП используются восемь способов адресации, из которых пять реализуются с помощью постбайта. На рис. 1.7 представлены форматы команд, иллюстрирующие задание различных способов адресации.

Регистровая адресация. Операнд находится в одном из РОН, код которого указывается в байте КОП (рис. 1.7, а) или в пост­байте при mod= 11 (рис. 1.7, б, в, д).

В командах с двумя опе­рандами может быть использовано два регистра, причем код вто­рого задается полем reg постбайта в соответствии с табл. 1.1. В командах, оперирующих словами, байт КОП содержит w=1 и код регистра определяет один из восьми 16-разрядных регистров АХ-DI. В командах, операндами которых являются байты (w = = 0), код регистра определяет один из восьми 8-разрядных ре­гистров AL-ВН в соответствии с табл. 1.1.

Непосредственная адресация. Операнд содержится в форма­те команды в виде одно- или двухбайтовой константы (рис 1.7, а, б). Этот способ задается особой комбинацией значений разрядов в поле КОП и может быть использован в большинстве команд с двумя операндами. Такие команды имеют постбайт, что делает возможным выполнение операций над константой и опе­рандом, расположенным в памяти или регистре. Способ непо­средственной адресации неприменим в командах загрузки сег­ментных регистров и в команде занесения данных в стек. В этих случаях используется промежуточная загрузка константы в один из регистров, указанных в табл. 1.1.

В командах с однобайтовыми операндами (w = 0) операнд имеет длину 1 байт и располагается в конце команды (рис. 1.7, а, б) в поле данных. В командах с операндами-словами (w = 1) операнд обычно занимает поле данных длиной 2 байт (рис. 1.7, а). Однако некоторые команды с операндами-словами могут иметь однобайтовый операнд, что указывается с помощью при­своения 1-разрядному полю s значения 1 (рис. 1.7, б). Если 5 = 1, то однобайтовое поле данных, содержащееся непосредст­венно в команде, перед использованием в операции расширяет­ся со знаком до 16-разрядного слова. Расширение со знаком позволяет использовать 16-разрядные операнды в диапазоне значений от -128 до +127, которые в команде записываются однобайтовым операндом вместо двухбайтового. Двухбайтовый операнд используется в случаях, когда значение требуемого операнда (константы) выходит за пределы указанного диапа­зона.

^ Прямая адресация. Исполнительный адрес операнда задается с помощью двух байтов, которые следуют за первым байтом (рис. 1.7, г) или за постбайтом (рис. 1.7,д). Младший байт ад­реса идет по порядку первым. Прямая адресация позволяет об­ращаться к операндам в пределах одного сегмента памяти ем­костью 64К байт.

Возможна также длинная прямая адресация, при которой команда содержит 16-разрядный базовый адрес сегмента, а так­же 16-разрядное смещение в сегменте (исполнительный адрес), что позволяет при программировании осуществить обращение к операнду, находящемуся в произвольном (не текущем) сегмен­те, т. е. в пределах всей памяти емкостью в 1М байт. Однако такой способ прямой адресации применим только в командах переходов и командах вызова подпрограмм, в которых он позво­ляет осуществлять межсегментные переходы. Невозможность применения этого способа адресации в командах, задающих опе­рации над данными, представляет определенное неудобство.

^ Косвенная регистровая адресация. Исполнительный адрес операнда содержится в одном из регистров ВХ, SI или DI, код которого задается в постбайте (рис. 1.7, б, в, д).

^ Адресация по базе. Реализуется с использованием постбайта, в котором указывается один из регистров ВХ, ВР или DI, содержащий 16-разрядный базовый адрес. Исполнительный адрес опе­ранда формируется путем сложения этого базового адреса и 8- или 16-разрядного смещения, указанного в команде непосредст­венно за постбайтом (рис. 1.7,6); 8-разрядное смещение рассматривается как число со знаком, т. е. его значение лежит в диапазоне от -128 до +127. Использование адресации по базе позволяет осуществить доступ к элементам упорядоченных струк­тур данных, когда смещение конкретного элемента данных из­вестно, а базовый адрес структуры вычисляется по программе.

^ Адресация с индексированием. В формате команды непосред­ственно за постбайтом задается 16-разрядный базовый адрес, а в постбайте указывается один из регистров ВХ, ВР, SI или DI, в котором хранится индекс (рис. 1.7, д). Адресация с индексиро­ванием логически эквивалентна адресации по базе с 16-разряд­ным смещением. Различие заключается в том, что 16-разрядное смещение интерпретируется как базовый адрес, а регистр хра­нит индекс. Однако поскольку любой из указанных четырех ре­гистров может применяться как при адресации по базе, так и • при адресации с индексированием, указанное различие являет­ся несущественным.

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

Поскольку любой из регистров ВХ и ВР может использовать­ся в качестве базового, а любой из регистров SI и DI может слу­жить индексным, имеется четыре различные комбинации регист­ров, которые могут реализовать адресацию по базе с индексиро­ванием. Кроме того, адресация по базе с индексированием может быть дополнена 8- или 16-разрядным смещением, которое являет­ся третьим слагаемым при вычислении исполнительного адреса ЕА; 8-разрядное смещение, как и ранее, рассматривается как число со знаком, находящемся в диапазоне от -128 до +127.

^ Относительная адресация. Исполнительный адрес вычисляет­ся как сумма содержимого указателя команд IP и 8- или 16-раз­рядного смещения со знаком, заданного непосредственно в команде (рис. 1.7, е). Следует подчеркнуть, что в момент вычис­ления исполнительного адреса значение указателя команд IP равно адресу первого байта следующей команды. Способ относи­тельной адресации так же, как и прямая адресация, имеет огра­ниченное применение и используется только в командах перехо­дов, вызова подпрограмм и управления циклами.

В завершение рассмотрения различных способов адресации отметим, что исполнительные адреса ЕА, получаемые описанны­ми выше способами, являются в действительности 16-разрядными смещениями в сегменте. Как было показано на рис. 1.3, 20-раз­рядный физический адрес получается путем сложения смещения в сегменте с предварительно сдвинутым на четыре разряда влево базовым адресом сегмента. Поскольку имеется четыре сегмент­ных регистра CS, DS, SS и ES, для выполнения каждого преоб­разования логического адреса в физический должен быть выбран определенный регистр, содержащий базовый адрес соответствую­щего сегмента. Это осуществляют аппаратные средства микро­процессора, которые автоматически выбирают сегментный регистр согласно цели каждого обращения к памяти, как показано в табл. 1.2. В таблице указан также источник логического адреса, определяющий смещение в сегменте.

В ряде случаев для эффективной передачи данных между сег­ментами удобно извлекать операнды, находящиеся в стековом сегменте, не прибегая к операциям со стеком. Это относится, на­пример, к извлечению параметров подпрограмм, которые нахо­дятся глубоко в стеке. Для подобных целей существует специ­альный вид обращения к памяти с использованием базового ре­гистра ВР. Данные, для доступа к которым используется регистр ВР, выбираются из стекового сегмента, причем содержимое регистра SS служит в этом случае базовым адресом, а смещение задается исполнительным адресом ЕА, в формировании которого участвует содержимое регистра ВР.

Таблица 1.2

Вид обращения к памяти

Сегментный регистр

Логический адрес

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

Операции со стеком

Обращение к исходной строке

Обращение к строке - результату

ВР - базовый регистр

Прочие обращения к переменной

CS

SS

DS*

ES

SS*

DS*

IP

SP

SI

DI

EA

EA

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

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

Режим ЦП устанавливается путем соответствующего под­ключения вывода MN/MX к уровню «1» для минимального режима и к уровню «0» для максимального. В зависимости от выбранного режима изменяется назначение некоторых выводов ЦП. На рис. 1.8 приведены обозначения выводов микропро­цессора, соответствующие минимальному режиму (MN/MX=1), а в табл. 1.3 указаны назначения выводов.

Режим ЦП устанавливается путем соответствующего под­ключения вывода MN/MX к уровню «1» для минимального режима и к уровню «0» для максимального. В зависимости от выбранного режима изменяется назначение некоторых выводов ЦП. На рис. 1.8 приведены обозначения выводов микропро­цессора, соответствующие минимальному режиму (MN/MX=1), а в табл. 1.3 указаны назначения выводов.





Рис. 1.8. Условно-графическое обозначение микросхемы ЦП Intel 8086
Наиболее широко функциональные возможности обес­печиваются при использовании ЦП в максимальном режиме работы, который характеризуется тем, что вырабатываются дополнительные управляющие сигналы, обеспечивающие совместную работу центрального процессора с другими центральными процессорами или с сопроцессорами. Сопроцессоры берут на себя выполнение арифметических действий и реализацию обмена данными с внешними устройствами. Тем самым достигается существенное повышение производительности по сравнению с минимальным режимом.

Область применения ЦП в максимальном режиме и по­строенных на его основе ВМ определяется их способностью с большой скоростью выполнять сложные и высокоточные вычис­ления. При установке максимального режима изменяется назначе­ние восьми выводов микропроцессора, что отражается в измене­нии их обозначений (рис. 1.8). На выходах s0, s1, s2 присутствует код состояния микропроцессора, характеризующий текущий цикл работы и определяющий способ использования ША/Д. Ис­пользование информации о состоянии ЦП позволяет в дальней­шем выработать все сигналы, необходимые для управления внешними устройствами ВМ.

Выводы RQ/GT0 и RQ/GT1 являются двунаправленными линиями, предназначенными для организации захвата системной шины другими устройствами. Вход запроса захвата RQ/GT0 имеет более высокий приоритет, а в остальном эти входы функ­ционально эквивалентны. Захват начинается с поступления на один из входов RQ/GT запроса захвата шин длительностью в один такт от внешнего устройства (если запрос поступит одно­временно на оба входа RQ/GT0 и RQ/GT1, то будет обслужи­ваться запрос по RQ/GT0). Во время очередного такта на этот вывод микропроцессор подает выходной сигнал, который информирует запросившее устройство о разрешении захвата. В следующем такте ЦП входит в режим захвата и устанавливает соответствующие выводы в высокоимпедансное состояние. По окончании использования системных шин ВУ информирует об этом ЦП сигналом освобождения шин, который также подается на вывод RQ/GT микропроцессора и имеет дли­тельность 1 такт. Получив этот сигнал, ЦП возобновляет работу.
Таблица 1.3

Обозначение вывода

Вход/выход

Назначение вывода

AD15-ADO

Вход/выход

Мультиплексированная ША/Д

AI6/S3-A19/S6

Выход

Линии адреса или состояния


BHE/S7

Выход

Разрешение старшего байта шины

RD

Выход

Управление чтением

WR

Выход

Управление записью

M/IO

Выход

Выбор памяти или ВУ

ALE

Выход

Разрешение фиксации адреса

DT/R

Выход

Управление пересылкой данных

DEN

Выход

Разрешение пересылки данных

MN/MX

Вход

Установка режима

TEST

Вход

Сигнал окончания режима ожидания

HOLD

Вход

Запрос захвата шин

HLDA

Выход

Подтверждение захвата

INTR

Вход

Запрос прерывания

NMI

Вход

Запрос немаскируемого прерывания

INTA

Выход

Подтверждение прерывания

READY

Вход

Готовность памяти или ВУ

RESET

Вход

Сброс (начальная установка)

CLK

Вход

Такты ГТИ

GND, +5 в

Вход

Общий (земля), питание



Вывод LOCK, так же как и рассмотренные выводы RQ/GT0 и RQ/GT1, служит для организации взаимодействия ЦП с внешними устройствами. Активный сигнал LOCK=0 вырабаты­вается с помощью специальной команды и позволяет в случае необходимости запре­тить захват шин ЦП внешними устройствами. Выводы QS0 и QS1 несут информа­цию о состоянии очереди из байтов команд. Для декодирования сигна­лов состояния микропроцес­сора s0, s1, s2 в систему (при использовании ЦП в максимальном режиме) включается системный контроллер Intel 8288, позволяющий осу­ществить полную развязку управляющей, адресной и информа­ционной шин, а также различение ВУ и ЗУ при обращении к этим устройствам. Это позволяет полностью реализовать воз­можности адресации, предусмотренные в ЦП, т. е. возможно­сти обращения к 1М байт памяти и 64К байт портов ввода-вывода.
^

1.3. Общая характеристика системы команд


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

В ряде случаев, особенно при разработке программного обес­печения для систем реального времени, важным является время выполнения той или иной программы, поэтому для каждой команды указывается число тактов n, требуемых для ее выполнения. Поскольку один и тот же формат команды мо­жет быть использован для задания различных способов адреса­ции и, следовательно, различных способов вычисления исполни­тельного адреса ЕА (см. 1.2), то время выполнения такой команды будет равно n + Ta, где Ta - время, необходимое для вычисления исполнительного адреса. Конкретное значение Ta зависит от используемого способа адресации, расположения 16-разрядного операнда в памяти (с четного или нечетного адреса) и наличия или отсутствия префикса замены сегмента. Для определения Ta могут быть использованы следующие данные (способ адресации – число тактов):
Прямая с 16-разрядным смещением - 6

По базе или с индексированием - 5

По базе или с индексированием при наличии константы смещения - 9

По базе с индексирование - 7

По базе с индексированием при наличии константы смещения - 11
Здесь приведены значения Ta для 8- или 16-разрядных операн­дов, расположенных по четным адресам. Если 16-разрядный операнд расположен с нечетного адреса, то к указанному выше значению времени следует прибавить еще четыре такта, а в случае использования префикса замены сегмента добавляется еще два такта.
^

1.4. Команды пересылки данных


Различают четыре типа пересылок: общего назначения, с уча­стием аккумулятора, адреса операнда и флагов. Ни одна из команд этой группы не влияет на флаги, за исключением двух команд, которые осуществляют явную загрузку регистра фла­гов F.

^ Пересылки общего назначения. Задаются с помощью четырех мнемокодов: MOV (переслать), PUSH (занести в стек), POP (извлечь из стека) и XCHG (обменять).

Команда MOV осуществляет пересылку байта или слова из источника в место назначения. В качестве источника и места назначения может служить регистр, память или сегментный регистр. Кроме того, источником могут являться данные (константы), непосредственно представленные в формате команды. Команда MOV часто используется в программах, что является одной из причин существования достаточно большого числа ее форматов. Выбор подходящего формата в определенной степени может оптимизировать программу по времени ее выполнения.

Команда PUSH служит для занесения содержимого 16-раз­рядного источника в стек. Источником операнда может являться регистр, сегментный регистр или память. Выполнению команды предшествует формирование адреса вершины стека: (SP) = (SP) – 2.

Команда POP служит для извлечения 16-разрядного операнда из стека и пересылки его в регистр, память или сегментный регистр. Операция извлечения из стека завершается формированием нового адреса вершины стека (SP) = (SP) + 2.

Команда XCHG вызывает обмен байтами или словами меж­ду источниками. В качестве источников могут служить регистры и память. Команда имеет всего два формата, поскольку сег­ментные регистры не могут использоваться при обмене.

^ Пересылки с участием аккумулятора. Состоят из трех команд: IN (ввод), OUT (вывод) и XLAT (трансляция). В отли­чие от рассмотренных выше пересылок общего типа эти коман­ды обязательно используют аккумулятор в качестве источника или места назначения операнда.

Команда IN служит для пересылки данных (байта или слова) из порта ввода в аккумулятор (в AL или АХ). Номер порта ввода может быть задан как непосредственно, во втором байте команды, так и косвенно, в регистре DX, причем только регистр DX из всех РОН может использоваться для этой цели. Если первый формат команды ввода позволяет адресоваться к 256 портам, то второй - к 216 = 65536 портам. Косвенное за­дание порта хотя и требует предварительной загрузки его номе­ра в DX, однако позволяет организовывать программные цик­лы, в которых используется изменяющийся номер портов ввода.

Команда OUT служит для пересылки данных (байта или слова) из аккумулятора (из AL или АХ) в порт вывода. Эта команда, как и команда IN, имеет два формата, которые опре­деляют способ адресации порта вывода. Преимущества и недо­статки использования каждого из форматов определяются теми же соображениями, что и для команды IN.

Команда XLAT осуществляет табличное преобразование кодов. Таблица размером не более 256 байт размещается в па­мяти, а ее начальный адрес - в регистре ВХ. При выполнении этой команды содержимое AL использу­ется в качестве относительного адреса строки таблицы, из которой байт пере­сылается в AL.

^ Пересылки адреса операнда. Включают три команды: LEA (загрузить исполнительный адрес), LDS (загрузить указатель в DS) и LES (загрузить указатель в ES). Эти команды служат средством управления механизмом адресации операндов.

По команде LEA извлекается не сам операнд, а его испол­нительный адрес ЕА. Действие команды состоит в передаче вычисленного 16-разрядного адреса операнда в 16-разрядный регистр, код которого указан в поле reg. Использование коман­ды LEA удобно при составлении подпрограмм, работающих с параметрами. В этом случае перед вызовом подпрограммы выделенный регистр загружается адресом переменной, которая предварительно записана в память в качестве параметра. На­пример, подпрограмма оперирует с параметром, адрес которого содержится в РОН ВХ. Если перед вызовом этой под­программы выполнить команду LEA BX, ALPHA, где ALPHA - имя ячейки памяти, содержащей переменную, то подпрограмма будет использовать в качестве параметра переменную из ячейки ALPHA. Если же перед вызовом подпрограммы выполнить команду LEA BX, BETA, то в качестве значения параметра под­программа будет использовать значение переменной из ячейки с именем BETA.

Команды LDS и LES используются, в основном, при обра­щении к данным, находящимся вне текущих сегментов DS или ES, так, что возникает необходимость изменить базовый адрес сегмента. Пара 16-разрядных адресов - база сегмента и смеще­ние в сегменте, называемая указателем, предварительно загру­жается в память. Относительный адрес указателя определяется значениями полей mod и rпостбайта команды LDS (или LES). Значение смещения содержится в двух первых байтах указателя, а базовый адрес сегмента - в третьем и четвертом байтах. По команде LDS (или LES) происходит обращение к указателю и осуществляется загрузка регистра DS (или ES) базовым адресом, а смещение пересылается в регистр, указан­ный полем reg постбайта команды.

Пересылки флагов. Включают четыре однобайтовые коман­ды: LAHF (загрузить ^ АН флагами), SAHF (запомнить АН в регистре F), PUSH F (занести F в стек) и POP F (извлечь из стека в F).

По команде LAHF осуществляется пересылка младшего байта регистра флагов F в АН, а по команде SAHF - обратная пересылка. Эти команды введены в систему команд ЦП для упрощения программной совместимости с ВМ80. В частности, без их использования для реализации команд PUSH PSW и POP PSW BM80 с помощью команд ЦП потребовалось бы по 9 байт памяти, а использование, например, команды LAHF позволяет при реализации команды PUSH PSW обой­тись всего двумя байтами: LAHF, PUSH AX. Команда PUSHF помещает содержимое регистра F в стек, причем сначала запи­сывается старший байт, а затем младший байт регистра F.
^

1.5. Арифметические команды


Микропроцессор ЦП выполняет четыре основных арифме­тических действия - сложение, вычитание, умножение и деление над 8- и 16-разрядными данными со знаками и без знака. Числа со знаком представлены в ЦП в дополнительном коде и их диа­пазон составляет от -32768 до +32767. Для реализации арифметических действий над числами, представленными в двоично-десятичном коде, введены специальные команды коррекции ре­зультатов. Все арифметические команды влияют на флаги.

^ Операции сложения. Включают три мнемокода: ADD (сло­жить), ADC (сложить с учетом переноса) и INC (увеличить на единицу).

Команда ADD осуществляет сложение операнда источника с операндом места назначения. Источником и местом назначе­ния обычно являются регистр и память, причем источником могут быть также данные (константы), непосредственно пред­ставленные в команде. В первом формате поле d определяет место назначения результатов сложения: при d = 1 - это ре­гистр, а при d = 0 - память.

Во втором формате поле s определяет число байтов данных, непосредственно представленных в команде. При s=0 команда состоит из 4 байт, причем в двух последних записана 16-разряд­ная константа. При s=1 команда состоит из 3 байт и послед­ний, третий, содержит 8-разрядную константу, которая предва­рительно (т. е. до сложения) расширяется со знаком до 16 раз­рядов. Напомним, что расширение со знаком состоит в распространении значения знакового разряда байта на весь старший байт; например, константа 5Аh будет расширена до 005Аh, а константа 8Аh - до FF8Аh.

Команда ADC выполняет операцию сложения двух операн­дов с прибавлением значения флага CF. Она используется для организации сложения многоразрядных чисел, двоичное пред­ставление которых превышает 16 разрядов. Сначала по команде ADD суммируются младшие разряды, а затем при сложении старших разрядов чисел используется команда ADC, ко­торая позволяет учитывать единицу переноса. В качестве источ­ника и места назначения операндов может служить регистр и память.

Команда ADC имеет форматы, аналогичные форматам команды ADD.

Команда INC вызывает увеличение на единицу (инкрементирование) содержимого регистра или памяти. Необходимо отме­тить, что эта команда, так же как и команда DEC, влияет на все флаги, кроме CF.

^ Операции вычитания. Включают пять мнемокодов: SUB (вычесть), SBB (вычесть с учетом заема), DEC (уменьшить на единицу), NEG (изменить знак) и СМР (сравнить).

По команде SUB происходит вычитание операнда источника из операнда места назначения. Как и в команде сложения, операнды могут находиться в регистрах и памяти. В качестве вычитаемого может также служить операнд (константа), задан­ный непосредственно в команде.

Команда SBB служит для вычитания операндов с учетом заема, т. е. наряду с операндами в вычитании участвует значе­ние флага CF.

Команда DEC вызывает уменьшение на единицу (декрементирование) содержимого регистра или памяти и имеет два формата, как и команда INC.

Команда NEG изменяет знак операнда, причем используется представление операнда в дополнительном коде. Например, если операнд есть -1 (11111111), то команда NEG изменит его на + 1 (00000001).

Команда СМР служит для сравнения двух операндов путем вычитания значения операнда места назначения из операнда источника. В отличие от обычного вычитания полученная раз­ность никуда не заносится, а результатом операции сравнения являются значения флагов, которые устанавливаются в зависи­мости от соотношения сравниваемых операндов. Команда СМР имеет форматы, аналогичные команде вычитания.

^ Операции умножения. Включают два мнемокода: MUL (ум­ножить) и IMUL (умножить числа со знаком).

По команде MUL происходит умножение без знака содержи­мого аккумулятора (AL или АХ) на операнд источника, а ре­зультат двойной длины возвращается в аккумулятор и регистр, используемый для его расширения (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов). Команда затрагивает только два флага CF и OF, которые устанавливаются в «1», если старшая половина резуль­тата отлична от нуля.

В отличие от операций сложения и вычитания обычное умножение чисел, представленных в двоичной системе счисле­ния, дает правильные результаты только для чисел без знака. Например, если рассматривать умножение 8-разрядных чисел 11111111В x 11111111В = 1111111000000001В как 255 x 255 = 65 025, то результат будет правильным. Если же эти перемно­жаемые числа рассматривать как числа со знаком (-1) x (-1), то результат -511 будет неверным. Когда перемножаемые операнды и результат рассматриваются как числа со знаком, используется команда IMUL.

^ Операции деления. Включают два мнемокода: DIV (разде­лить) и IDIV (разделить числа со знаком).

По команде DIV происходит деление без знака операнда двойной длины, находящегося в аккумуляторе и регистре, ис­пользуемом для расширения аккумулятора (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов) на операнд из заданного источника. Частное зано­сится в аккумулятор (AL или АХ), а остаток - в регистр расши­рения аккумулятора (АН или DX). При выполнении операции деления флаги принимают произвольные значения. При поло­жительном частном, превышающем максимально допустимое значение max, или при отрицательном частном, которое меньше, чем 0 - (mах+1), частное и остаток будут иметь неопределен­ные значения и произойдет прерывание типа 0.

Особенность команды деления IDIV состоит в том, что част­ное и остаток всегда имеют одинаковые знаки. Например, при делении числа -47 на +3 из двух возможных результатов: -15 с остатком -2 и -16 с остатком +1, будет получен пер­вый результат. Дробные значения частного округлены до бли­жайшего целого. Значения флагов при выполнении команды IDIV также не определены.

Операции коррекции результата позволяют выполнять ариф­метические действия над числами, представленными в двоично-десятичной системе счисления или в коде ASCII, используемом при обмене информацией и при вводе с клавиа­туры. Для коррекции результатов сложения и вычитания чисел в двоично-десятичной системе служат команды DAA (коррекция сложения) и DAS (коррекция вычитания).

Аналогичным образом, но с вычитанием констант 6 и 60Н осуществляется коррекция результата вычисления в AL по команде DAS.

Поскольку для чисел, представленных в обычном двоично-де­сятичном коде, коррекция результатов умножения и деления не­возможна, используется неупакованный двоично-десятичный код ASCII.

Для коррекции результатов арифметических действий над числами в коде ASCII используются четыре команды: AAA (кор­рекция сложения), AAS (коррекция вычитания), ААМ (коррек­ция умножения) и AAD (коррекция деления).

К группе арифметических операций относятся также две команды, которые осуществляют расширение со знаком 8- и 16-разрядных операндов. Эти команды играют вспомогательную роль при подготовке операнда, используемого в качестве дели­мого. Поскольку делимое при делении 8-разрядных операндов размещается в 16-разрядном аккумуляторе АХ (а при делении 16-разрядных операндов в 32-разрядном составном регистре DX, АХ), необходимо при подготовке делимого заполнить АН (или DX). Для чисел без знака указанные регистры заполняются ну­лями. При делении чисел со знаком перед заполнением указан­ных регистров требуется анализировать знак делимого и запол­нить регистр либо нулями, если делимое является положитель­ным, либо единицами, если делимое отрицательное. Для этих целей используются команды CBW (расширение со знаком бай­та до слова) и CWD (расширение со знаком слова до двойного слова). По команде CBW (CWD) знак AL (или АХ), т. е. самый старший разряд регистра, записывается во все разряды регист­ра АН (или DX).
^

1.6. Сдвиги и логические команды


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

^ Команды сдвига. Обеспечивают прежде всего удвоение чисел и деление пополам. Для удвоения числа без знака достаточно сдвинуть все его разряды на один влево, заполнив младший бит нулем. Поскольку старший бит при сдвиге передается в разряд CF, анализ значения этого флага позволяет судить о точности результата. Например, удвоение числа 65 (01000001) путем сдвига влево дает точный результат 130 (10000010), что определяется значением CF=0. Дальнейшее удвоение даст не­правильный результат 4 (00000100), что определяется значением CF=1. Аналогично, используя сдвиг вправо, осуществляется деление числа без знака пополам. Например, сдвигая число 13 (00001101), получаем 6 (00000110) и CF=1, что свидетельствует о неточном результате.

Команды, выполняющие удвоение и деление пополам чисел без знака, имеют мнемокоды SHL (логический сдвиг влево) и SHR (логический сдвиг вправо) соответственно. Аналогичные операции для чисел со знаком реализуются с помощью команд SAL (арифметический сдвиг влево) и SAR (арифметический сдвиг вправо).

Длина сдвигаемого операнда, как обычно, опре­деляется полем w первого байта (w = 0 - 8-разрядный операнд, w = 1 - 16-разрядный операнд). С помощью любой из перечис­ленных команд сдвига операнд может сдвигаться на произволь­ное число разрядов до 8 или 16 включительно.

Значение флага OF устанавливается равным «1», если окончательное значение бита знака при последнем сдвиге отли­чается от его предыдущего значения.

^ Логические команды. Служат для реализации четырех буле­вых функций: AND (поразрядное логическое И), OR (поразряд­ное логическое ИЛИ), XOR (поразрядная логическая сумма по модулю 2) и NOT (поразрядное логическое НЕ). Сюда также от­носится команда TEST (проверка), которая состоит в поразряд­ном логическом умножении (И) операндов без занесения резуль­тата умножения в место назначения и служит для анализа со­держимого источника по значениям флагов.

Все двухоперандные команды AND, OR, XOR и TEST имеют по три одинаковых формата и совпадают по времени исполне­ния. Однооперандная команда NOT осуществляет инвертирова­ние операнда и имеет один формат. Следует отметить, что при выполнении логических команд флаги CF и OF не изменяют сво­их значений, а в соответствии с результатом операции устанав­ливаются флаги PF, SF и ZF. Флаг AF после выполнения логи­ческих команд имеет неопределенное значение.
^

1.7. Команды обработки строк данных


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

Для иллюстрации временных затрат на обработку одного элемента строки рассмотрим процесс пересылки строки из одной области памяти в другую. Для указания начального адреса пер­вого элемента исходной строки и строки результата используют­ся регистры SI (индекс источника) и DI (индекс места назначе­ния) соответственно, число пересылаемых элементов задается в регистре-счетчике СХ. Пересылка строки заключается в выпол­нении следующих шагов (при описании каждого шага указана соответствующая команда):

1: JCXZ Exit ; если СХ=0, то пересылка закончена

2: MOV AL, [SI] ; переслать байт из в AL

3: MOV [DI], AL ; запомнить содержимое AL в памяти

4: INC SI ; увеличить SI на «1»

5: INC DI ; увеличить DI на «1»

6: DEC СХ ; уменьшить СХ на «1»

7: JNZ 1 ; перейти к шагу 1.

Собственно пересылка байта выполняется на шагах 2 и 3. На шагах 4 и 5 осуществляется вычисление адресов источника и места назначения для следующего элемента строки. Наконец, шаги 1, 6 и 7 служат для определения числа обработанных эле­ментов.

Действия, которые выполняются с помощью указанных че­тырех команд на протяжении шагов 2-5, могут быть выполне­ны с помощью одной команды MOVS (переслать элемент стро­ки). Для организации циклического исполнения команды MOVS (а также других команд обработки строк) используется одно­байтовая команда-префикс REP (повторить). Она записывается перед основной командой (например, REP MOVS) и обеспечи­вает ее выполнение N раз. Число повторений N предварительно записывается в регистр СХ и на каждом шаге содержимое СХ уменьшается на единицу. Используются три мнемокода команды-префикса: REP, REPNE/REPNZ и REPE/REPZ. Первый мнемо­код анализирует только одно условие окончания повторений: (СХ)=0. В тех случаях, когда возникает необходимость допол­нительно анализировать условие ZF=0 (или ZF=1), исполь­зуется второй (или третий) мнемокод. Команда REP позволяет еще больше сократить время на обработку элементов строки за счет совмещения операций (СХ) = (СХ) - 1 с проверкой дости­жения счетчиком нуля. Так, совокупность действий, выполня­емых за семь указанных выше шагов, может быть выполнена командой MOVS с префиксом REP.

В ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего ее эле­мента. Например, требуется переслать строку, содержащую 10 байт и расположенную в памяти, с относительного адреса (SI) = 200 по (SI) = 209 в область памяти с относительного ад­реса (DI)=205 no (DI) =214. Ясно, что такую пересылку нель­зя выполнять начиная с первого элемента, так как области па­мяти с исходной строкой и строкой-результатом перекрываются и первая же пересылка «испортит» значение пятого элемента ис­ходной строки. Требуемую пересылку строк можно осуществить начиная с последнего элемента исходной строки. В этом случае следует установить начальные адреса элементов строк равными (SI) =205 и (DI) =214. Кроме того, при пересылке каждого элемента необходимо не увеличивать, а уменьшать на единицу содержимое индексных регистров SI и DI. Направление переда­чи устанавливается с помощью флага DF: при значении DF=1 происходит автодекрементирование индексных регистров, а при значении DF=0 - автоинкрементирование.

Когда в качестве элементов строк используются не байты, а слова, соответствующее увеличение или уменьшение значений индексных регистров осуществляется на два, т. е. при DF=1: SI = SI - 2; DI = DI - 2, а при DF=0: SI = SI + 2, DI = DI + 2.

Кроме команды MOVS для действия со строками имеется еще четыре команды: CMPS (сравнение элементов строк), SCAS (сканирование элементов строки), LODS (загрузка эле­мента строки) и STOS (заполнение элемента строки).

Команда CMPS позволяет осуществить поэлементное сравне­ние двух строк, одна из которых располагается в памяти с отно­сительного адреса, указанного в SI, а вторая - с относительного адреса, указанного в DI. По команде CMPS производится вы­читание элемента строки с адресом в SI из элемента строки с ад­ресом в DI. Как обычно, при выполнении операции сравнения результат вычитания не фиксируется, а устанавливаются соот­ветствующие значения флагов, по которым определяется резуль­тат сравнения. По аналогии с командой MOVS при сравнении изменяются значения индексных регистров по правилу: SI = SI ± А; DI = DI ± A, где « + » - используется при DF=0; «-» - при DF=1; А=1- при w = 0; А = 2 при w=1.

Для циклического повторения команды CMPS используется префикс повторения REPNE/REPNZ или REPE/REPZ.

По команде сканирования SCAS производится сравнение зна­чения элемента строки, расположенной с относительного адреса, который указан в DI, со значением AL. При этом также осуще­ствляется операция вычитания, результат которой не фиксирует­ся. Одно из возможных применений команды сканирования со­стоит в отыскании элемента строки, равного заданному образцу.

Образцовый элемент загружается в AL и затем организуется цикл сканирования с использованием префикса повторения REPE/REPZ. Как и при выполнении предыдущих команд, каж­дый раз по команде SCAS производится автоинкремент (или автодекремент) адреса элемента: (DI) = (DI) ± A.

Две следующие команды LODS (загрузка элемента строки) и STOS (запись элемента строки) позволяют загружать элемен­ты строки в аккумулятор и записывать содержимое аккумулято­ра в строку. При выполнении этих команд осуществляется под­готовка адреса следующего элемента строки, т. е. модифициру­ется содержимое соответствующего индексного регистра. Однако повторение команды LODS обычно не используется, а повторе­ние команды STOS, организуемое с помощью префикса REP, применяется при загрузке строки константой, предварительно помещенной в аккумулятор.

Рассмотренные выше команды работы со строками реализуют относительно простые операции, на базе которых можно органи­зовать более сложные операции обработки строк.
^

1.8. Команды передачи управления


В группе команд передачи управления различают четыре ти­па команд: безусловные переходы, условные переходы, циклы и прерывания.

Команды безусловных переходов. Включают три мнемокода: JMP (безусловный переход), CALL (вызов подпрограммы) и RET (возврат из подпрограммы).

Команда JMP позволяет осуществить переход в любую точку программы, расположенную как в текущем программном сегмен­те, так и в другом сегменте. При переходе в пределах текущего программного сегмента используются первые три формата ко­манды JMP.

Первый формат обеспечивает переход в произвольную точку программы внутри текущего программного сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разряд­ное смещение, старший разряд которого является знаковым. Вто­рой, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на -128-f-127 адресов от команды JMP. Наконец, третий формат осуществляет загрузку указателя команд 16-разрядным числом, которое размещено по исполни­тельному адресу ЕА, определяемому постбайтом. Этот переход называется косвенным, так как используется косвенная адреса­ция.

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

Четвертый формат определяет прямой межсегментный пере­ход, при котором во втором и третьем байтах формата указан относительный адрес точки перехода, а в четвертом и пятом бай­тах- новое значение CS. Пятый формат с помощью постбайта позволяет определить исполнительный адрес ЕА, по которому на­ходится относительный адрес точки перехода (в байтах памяти с адресами ЕА, ЕА+1), и новое значение CS (в байтах памяти ЕА+2, ЕА+3).

Команда CALL позволяет вызвать подпрограмму, располо­женную как в текущем программном сегменте, так и в другой области памяти. Она имеет такие же форматы, что и команда JMP, за исключением укороченного. В отличие от команды JMP аналогичного формата по команде CALL перед изменением зна­чений IP или IP и CS происходит автоматическая запись в стек текущих значений этих регистров, что обеспечивает запомина­ние точки возврата из подпрограммы.

Для возврата из подпрограммы используется команда RET, под действием которой происходит передача управления по ад­ресу возврата, занесенному в стек при выполнении предыдущей команды CALL. При возврате из подпрограмм, расположенных в текущем программном сегменте, применяются первые два фор­мата команды RET, причем второй формат отличается от перво­го тем, что к содержимому указателя стека добавляется констан­та, записанная во 2-м и 3-м байтах команды. Это позволяет одновременно с возвратом из подпрограммы сбрасывать пара­метры, записанные в стек при выполнении этой подпрограммы и не используемые в дальнейшем.

Для межсегментного возврата применяются третий и четвер­тый форматы RET, которые обеспечивают восстановление содер­жимого как указателя команд, так и программного сегмента.

^ Команды условных переходов. Осуществляют передачу уп­равления в зависимости от результатов предыдущих операций. Различают три разновидности условных переходов, которые ис­пользуются для установления соотношений чисел со знаком, чи­сел без знака и произвольных чисел. В первых двух разновидно­стях для одних и тех же соотношений между числами выбирают­ся различные мнемокоды команд, поскольку одним и тем же соотношениям чисел со знаком и чисел без знака соответствуют различные значения флагов.

В мнемокодах команд условных переходов при сравнении чи­сел со знаком для обозначения условия «больше» используется буква G (Greater - больше), а для обозначения - «меньше» буква L (Less - меньше). Для аналогичных условий при сравне­нии чисел без знака используются соответственно буквы A (Abo­ve- над) и В (Below - под). Условие равенства обозначается буквой Е (Equal - равно), а невыполнение некоторого условия - буквой N (Not - не). Следует отметить, что допускается исползование двух различных мнемокодов для каждой команды; на­пример, мнемокоды JL и JNGF - эквивалентны, поскольку ус­ловия «меньше» и «не больше или равно» - идентичны.

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

Таблица 1.4

^ Мнемокод команды

Условие

Значение флагов




^ Для чисел со знаком




JL/JNGE

Меньше/не больше или равно

SF + OF = l

JNL/JGE

Не меньше/больше или равно

SF + OF = 0

JG/JNLE

Больше/не меньше или равно

(SF + OF) V ZF = 0

JNG/JLE

Не больше/меньше или равно
^ Для чисел без знака

(SF + OF) V ZF = l

JB/JNAE

Меньше/не больше или равно

CF = 1

JNB/JAE

Не меньше/больше или равно

CF = 0

JA/JNBE

Больше

CF V ZF = 0

JNA/JBE

Не больше

^ Для прочих данных



CF V ZF = 1

JE/JZ

Равно/по нулю

ZF = 1

JNE/JNZ

Не равно/по нулю

ZF = 0

JS

По минусу

SF = 1

JNS

По плюсу

SF = 0

JO

По переполнению

OF = l

JNO

По отсутствию переполнения

OF = 0

JP/JPE

По четному паритету

PF = 1

JNP/JPO

По нечетному паритету

PF = 0

Все команды условных переходов имеют одинаковый двух­байтовый формат, в первом байте которого задается код опера­ции (КОП), а во втором - 8-разрядное смещение, которое рас­сматривается как число со знаком и, следовательно, позволяет осуществлять изменение адреса в диапазоне от -128 до +127. При необходимости более отдаленного («дальнего») перехода по выполнению условия используется дополнительно команда безусловного перехода.

Время выполнения каждой из команд условных переходов указано для двух случаев: 1) условие выполнено и управление действительно передается в соответствии со смещением, 2) ус­ловие не выполнено, так что управление передается следующей команде.

^ Команды организации циклов. Введены в ЦП для удобства выполнения вычислительных циклов. К ним относятся следующие мнемокоды: LOOP (цикл, пока (СХ) не равно 0), LOOPNZ/LOOPNE (цикл, пока не нуль/не равно), LOOPZ/LOOPE (цикл, пока нуль/равно) и JCXZ (переход по нулю в СХ). Каждая из этих команд имеет двухбайтовый формат, во втором байте кото­рого указывается 8-разрядное смещение, используемое для орга­низации перехода. Это смещение рассматривается как число со знаком и перед вычислением адреса перехода оно расширяется со знаком до 16 разрядов.

Используя команды циклов совместно с командами манипу­ляции элементами строк, можно составлять достаточно сложные программы преобразования строк. Рассмотрим пример составле­ния программы для перевода строки данных, записанных в шестнадцатеричной системе счисления, в некоторый код, для которого перекодировочная таблица находится в памяти с начального ад­реса, указанного в ВХ, как это требуется для использования команды табличного преобразования кодов XLAT. Пусть далее исходная строка содержит 80 элементов и находится в памяти с относительного начального адреса 100, а строка-результат дол­жна быть размещена с относительного адреса 200. Программа, выполняющая перекодировку исходной строки в строку-резуль­тат, при значении флага направления DF=0 будет иметь вид:

MOV SI ,100
MOV DI ,200
MOV СХ , 80

^ TRANSLATE: LODS

XLAT

STOS

LOOP TRANSLATE

Здесь использована команда табличного преобразования кодов XLAT, описанная в 1.2.

Команды прерывания. Включают три мнемокода: INT (пре­рывание), INTO (прерывание при переполнении) и IRET (воз­врат из прерывания).

Команда прерывания INT при v = 1 имеет двухбайтовый фор­мат, второй байт которого содержит 8-разрядное число, определя­ющее тип (type) или уровень прерывания. По команде INT type процессор переходит к выполнению программы обслуживания прерывания указанного уровня, причем автоматически выполня­ются действия, необходимые для обеспечения возврата в точку прерывания. Эти действия состоят в следующем: содержимое регистра флагов F записывается в стек (PUSHF), сбрасывают­ся флаги IF и TF, текущие значения регистра CS и указателя команд IP записываются в стек.

Для определения начального адреса программы обслужива­ния в соответствии со значением type используется таблица уровней прерывания. Для каждого из 256 уровней прерываний в этой таблице от­ведено по четыре байта: первые два байта определяют значение указателя команд IP, вторые - значение сегментного регистра CS. Эта четверка байтов определяет начальные адреса программ обслуживания (пары значений CS, IP), которые должны быть предварительно записаны в ячейки памяти по абсолютным адре­сам 0-3FFH. Адрес таблицы, соответствующий указанному в команде INT type уровню прерывания, определяется в ЦП сле­дующим образом. После запоминания в стеке текущих значений CS и ГР осуществляются загрузки: CS = type x 4 + 2 и IP = type x 4. Новые значения CS и IP, взятые соответственно из ячеек с адресами type x 4 + 2 и type x 4, определяют начальный адрес требуемой программы обслуживания.

Рассмотренная выше команда прерывания INT при значении поля v = 0 имеет однобайтовый формат, т. е. не требует специаль­ного указания уровня прерывания. Эта команда автоматически воспринимается процессором как прерывание третьего уровня (type=3) и обычно используется в программах в качестве контрольной точки.

Команда прерывания при переполнении INTO вызывает пе­реход на обслуживание прерывания четвертого уровня (type = 4) в случае, когда значение флага переполнения OF = 1. Команда INTO обычно используется после арифметических команд над числами со знаком. Обычно несколько первых уровней прерыва­ний (до 32) резервируются под обработку ряда специфических ситуаций, таких, например, как попытка деления на нуль, переполнение и тому подобных.

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

Однобайтовая команда IRET ставится в конце каждой про­граммы обслуживания прерывания и обеспечивает возврат из прерывания. По этой команде процессор извлекает из стека значение указателя команд IP и программного сегмента CS, а также восстанавливает прежнее содержимое регистра флагов F (как и по команде POPF). При необходимости содержимое остальных регистров ЦП, соответствующее прерываемой программе, может быть запомнено в стеке при переходе на программу обслужива­ния и затем восстановлено при возврате из нее с помощью команд обращения к стеку.
^

1.9. Команды управления процессором


В группе команд управления процессором различают три типа: операции с флагами, установки ЦП в особые состояния и синхронизации с сопроцессорами.

^ Операции с флагами. Включают семь мнемокодов команд: STC (установка флага переноса CF), CMC (дополнение флага переноса CF), CLC (сброс флага переноса CF), STD (установ­ка флага направления DF), CLD (сброс флага направления DF), STI и CLI (соответственно установка и сброс флага разрешения прерывания IF).

Назначение перечисленных команд очевидно. Так, команды STC CMC и CLC позволяют задавать требуемое исходное зна­чение флага CF при различных арифметических и логических преобразованиях данных и сдвигах. Команды STD и CLD ис­пользуются при обработке строк для задания направ­ления обработки: от первого элемента строки к последнему или наоборот. Наконец, команды STI и CLI служат для управления системой прерываний и позволяют соответственно разрешить или запретить прерывание на любом участке программы.

^ Команды установки ЦП в особые состояния. Включают два мнемокода: HLT (останов) и WAIT (ожидание), которые пере­водят процессор соответственно в состояние ожидания или оста­нова.

Находясь в любом из этих состояний, процессор не выполня­ет никаких действий до тех пор, пока не будут поданы определенные внешние воздействия. Из состояния останова процессор может быть выведен двумя спо­собами: путем начального сброса (сигналом по входу RESET) либо внешним прерыванием (сигнал запроса по входу INTR). При первом способе процессор перейдет к выполнению основной программы сначала, во втором - к выполнению программы об­служивания прерывания соответствующего уровня. При выпол­нении команды HLT содержимое указателя команд IP автомати­чески увеличивается на единицу, так что после выполнения программы обслуживания прерывания процессор перейдет к вы­полнению следующей за HLT команды.

Основной способ вывода процессора из состояния ожидания состоит в подаче сигнала отрицательной полярности на вход TEST. Таким образом, время нахождения в состоянии ожидания определяется моментами подачи команды WAIT и появлением активного нуля на входе TEST. Управление ожиданием с помо­щью этого механизма позволяет осуществлять синхронизацию, т. е. сопряжение во времени работы процессора с различ­ными внешними устройствами (например, с сопроцессорами либо с устройствами, обладающими меньшим быстродействием). В слу­чае, когда сигнал на входе TEST активен в момент подачи ко­манды WAIT, процессор будет находиться в состоянии ожида­ния в течение трех тактов ГТИ.

Второй способ вывода процессора из состояния ожидания за­ключается в подаче запроса прерывания по входу INTR. Однако в этом случае процессор выходит из состояния ожидания только временно. По команде WAIT не происходит автоматического на­ращивания указателя команд IP, вследствие чего после выпол­нения соответствующей программы обслуживания прерывания процессор вновь перейдет к выполнению команды WAIT, т. е. пе­рейдет в состояние ожидания. Важно отметить, что при возобновлении работы процессора после ожидания (по сиг­налу TEST = 0) внешние прерывания не будут обслуживаться до тех пор, пока не выполнится следующая за WAIT команда.

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

Для организации совместной работы основного процессора системы с сопроцессорами служит команда ESC. Первый байт формата команды содержит код операции ESC, равный 11011, и трехразрядное поле х; второй байт имеет структуру постбайта, в котором поле reg обозначено как у (рис 1.9). Поле х указывает номер того сопроцессора многопроцессор­ной системы, который должен выполнить операцию, а поле у - номер (код) этой операции. Для организации взаимодействия основного процессора с сопроцессорами последние должны сле­дить за появлением в потоке команд основного процессора команды ESC, которая укажет, какой сопроцессор и какую операцию должен выполнять. В общем случае поля х и у позволя­ют задать 64 комбинации 6-разрядных двоичных кодов, что при необходимости произвольным образом изменяет стандартное назначение полей х и у. Например, можно построить систему с одним сопроцессором, который выполняет 64 различные опера­ции, либо с восемью сопроцессорами, каждый из которых бу­дет выполнять до восьми операций, и т. д.



Рис. 1.9. Фрагмент программы умножения чисел с плавающей запятой

Поля mod и rim второго байта команды ESC используются для задания адреса операнда. По содержимому этих полей ос­новной процессор извлекает операнд из памяти и выставляет его значение на ШД в качестве операнда для сопроцессора. Та­ким образом, основной процессор выдает всю необходимую ин­формацию для работы соответствующего сопроцессора: момент включения в работу (появление кода операции ESC), номер сопроцессора (поле х), код операции (поле у) и операнд (вы­ставлен на ШД).

Контрольные вопросы


  1. Каково назначение блока преобразования адресов в ЦП?

  2. Дайте сравнительную характеристику способов адресации.

  3. Чем определяется время формирования исполнительного адреса?

  4. Каковы основные отличия работы ЦП в минимальном и максимальном режимах?

5. В чем заключается назначение системного контроллера Intel 8288?

6. 7. В чем состоит различие в использовании флагов CF и OF?

8. В чем сходство и различие выполнения команд MUL и IMUL, а также DIV и IDIV?

9. В чем состоит основное назначение команды SCAS?

10. Какие ограничения присущи командам передачи управления?

11. Перечислите все префиксы, которые можно использовать с командой MOV.

  1. Объясните главное различие в состояниях останова и ожидания, в которые ЦП попадает после выполнения команды HLT и WAIT, соответственно?

  2. Какие команды выполняют удвоение и деление пополам чисел со знаком?

  3. Сколько восьмиразрядных РОН вы знаете? Перечислите их имена.

  4. Как используется регистр ВР для доступа к содержимому стека?

  5. Что принято называть программной моделью процессора?

  6. Для чего служат регистры-индексы?

  7. В каких операциях по умолчанию используется сегментный регистр ES?

  8. Могут ли совпадать значения в регистрах DS и CS?

  9. Назовите три флага управления режимом работы ЦП.

  10. В какое значение установятся флаги CF и SF после вычитания из меньшего числа большего?

  11. В каком из способов адресации используется больше всего составляющих при формировании эффективного адреса?

  12. Сколько байтов занимает самый длинный и самый короткий формат команды?

  13. Почему очередь команд состоит из 6-ти байтов?

  14. В чем состоит особенность команд работы с портами ввода и вывода?

  15. Какое значение примут флаги ZF, SF и CF после выполнения команды

add ah,bh, если перед выполнением команды ah = bh = 128?

  1. Объясните назначение флага DF на примере. Когда требуется устанавливать DF = 1?

  2. Поясните принцип формирования мнемокодов команд условных переходов.

  3. Как ЦП определит начальный адрес подпрограммы обслуживания прерывания 25-го уровня?

  4. Какие действия может выполнять ЦП, находясь в состоянии ожидания?


  1   2   3   4   5   6   7   8   9   10   11



Скачать файл (2871.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru