Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Цифровые устройства и микропроцессоры

.pdf
Скачиваний:
516
Добавлен:
09.06.2015
Размер:
3.6 Mб
Скачать

30

Рис. 9. Временная диаграмма работы МП ВМ88

При построении систем, содержащих ЦП ВМ86/ВМ88 и арифметический сопроцессор ВМ87, необходимо, чтобы сопроцессор имел информацию о типе используемого ЦП и соответственно о разрядности шины данных и длине очереди команд. Для этого сопроцессор проверяет уровень сигнала на выводе 34 непосредственно после окончания сигнала RESET, на котором ВМ88 в максимальном режиме устанавливает постоянное напряжение высокого уровня, а ВМ86 — сигнал BHE/S7. Так как в ВМ86 первой выбирается команда по четному адресу FFFFO, то первоначально устанавливается сигнал ВНЕ = 0. Естественно, что ЦП и сопроцессор должны иметь общую линию сброса. Когда к ЦП подключены сопроцессор и независимый процессор, который выбирает свои команды, сопроцессор должен определять, каким процессором выбирается команда, чтобы правильно модифицировать свою очередь команд. Для этого сопроцессор контролирует бит состояния ST6, на который МП ВМ88, как и ВМ86, всегда выводит напряжение низкого уровня, а процессор ввода – вывода ВМ89 – высокого уровня.

3.6. Инициализация, сброс и синхронизация микропроцессоров.

Тактовая синхронизация работы микропроцессорной системы производится с помощью генератора тактовых импульсов К1810ГФ84, сигналы синхронизации поступают на вход CLK микропроцессора с периодом повторения, рав-

ным 200-500 нс.

Сброс микропроцессора производится по входу CLR (RESET) сигналом длительностью не менее 50 мкс. При действии сигнала сброса МП прекращает все свои действия и переводит шины и некоторые управляющие сигналы в высокоимпедансное состояние. При этом производится инициализация регистров микропроцессора следующим образом: все регистры, в том числе регистр IP, обнуляются, а сегментный регистр CS устанавливает все свои разряды в «1».

31

Таким образом, МП начинает свою работу с адреса FFFF0h. Обычно здесь находится команда перехода на начало программы Jmp.

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

3.7.Прерывания работы микропроцессора

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

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

Прерывания могут поступить от внешних устройств, они могут быть инициированы специальными командами или самим микропроцессором. Итак, прерывания – это вызываемый определённым образом процесс, переключающий МП на выполнение другой программы с последующим возвратом к прерванной программе. Прерываний в МПС на базе I8086/88 256 типов (0…255). Они делятся на внешние аппаратные, внутренние аппаратные и программные. Любые прерывания требуют новых адресов подпрограмм прерываний, которые выбираются из таблицы векторов. Подробно эти вопросы рассмотрены в разде-

ле 5.2.

Лекция № 7

4. СИСТЕМА КОМАНД МИКРОПРОЦЕССОРА I8086

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

32

тем, что ассемблерная программа может исполняться только на том процессоре, для которого она была написана.

4.1. Форматы команд

Команды и данные представляются в одинаковой формат т. е. в виде двоичных чисел, которые по шине данных передаются в центральный процессор. Команда должна определить:

саму операцию, эта часть называется кодом операции (КОП);

информацию об адресе или адресах (в зависимости от типа команды) данных, с которыми нужно произвести операцию.

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

Последние процессоры серии Intel имеют максимальную длину машинной команды – 15 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного – только КОП. В дальнейшем будем рассматривать форматы команд только для микропроцессора I8086/88.

Команды микропроцессора I8086/88 (К1810 ВМ86/88) могут адресовать один или два операнда. Однако в таких командах один из операндов должен обязательно располагаться в регистре, поскольку имеются команды типа регистр – регистр, регистр – память и память – регистр, но команды типа память – память отсутствуют (за исключением команды обработки строк данных). В общем виде формат команд приведён на рис. 10.

КОП

Биты

mod

Reg

R/m

Disp 8/16

Date 8/16

 

 

d, w или

 

 

 

 

 

 

 

 

s, w

 

 

 

 

 

 

 

1 байт

1 байт

 

1-2 байта

1-2 байта

 

Рис. 10. Формат команд

Первый байт команды содержит код операции КОП и однобитовые поля d и w или s и w или один бит w. При d = 1 осуществляется передача операнда или результата операции в регистр, который определяется полем reg второго байта команды, при d = 0 – передача из указанного регистра. Поле w определяет разрядность операнда: при w = 1 команда оперирует словами, при w = 0 – байтом.

Второй байт называется постбайтом. С его помощью определяются участвующие в операции регистры и ячейки памяти. Постбайт состоит из трёх полей: двухбитовое поле mod и два трёхбитовых поля reg – регистр и r/m – регистр/память. Поле mod используется для определения способа адресации, поле reg определяет операнд, который обязательно находится в регистре микропроцессора (далее – МП) и условно считается вторым операндом. Это поле используется для указания имени регистра только в двухоперанд-

33

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

 

 

 

 

 

Табл. 5.

Поле r/m или

W=0

W=1

Поле r/m

W=0

W=1

reg

 

 

или reg

 

 

000

AL

AX

100

AH

SP

001

CL

CX

101

CH

BP

010

DL

DX

110

DH

SI

011

BL

BX

111

BH

DI

Если поле mod = 11, используется регистровая адресация операндов, тогда в поле r/m помещается код регистра, в котором находится первый операнд. Когда адресуется память, поле mod определяет вариант использования смещения disp, находящегося в третьем и четвёртом байтах, или показывает его отсутствие (табл.6). Смещение disp, входящее в состав команды, интерпретируется как знаковое целое, участвующее в вычислении эффективного (или исполнительного) адреса ЕА. В свою очередь, из-за сегментной организации памяти весь эффективный адрес ЕА является смещением (offset) относительно базового адреса сегмента (рассматривается как беззнаковое целое при вычислении физического адреса). Использование одного и того же термина «смещение» и для disp, участвующего в вычислении эффективного логического адреса ЕА, и для самого ЕА, являющегося смещением при вычислении физического адреса, может внести путаницу. Давайте в необходимых случаях будем называть “offset” смещением в сегменте.

 

 

 

 

Таблица 6

 

r/m

 

Mod

10

 

 

00

01

00

 

BX+SI

BX+SI+disp 8

BX+SI+disp 16

01

 

BX+DI

BX+DI+disp 8

BX+DI+disp 16

10

 

BP+SI

BP+SI+disp 8

BP+SI+disp 16

11

 

BP+DI

BP+DI+disp 8

BP+DI+disp 16

00

 

SI

SI+disp 8

SI+disp 16

 

 

 

 

 

01

 

DI

DI+disp 8

DI+disp 16

10

 

disp16

BP+disp8

BP+disp 16

11

 

BX

BX+disp 8

BX+disp 16

4.2.Способы адресации

В МП I8086/88 разрядность адресов равна 20, однако процессор манипулирует 16-разрядными логическими адресами, к которым относятся начальные (базовые) адреса сегментов памяти и значения смещений в этих сегментах. Физический адрес вычисляется следующим образом: содержимое каждого сегментного регистра рассматривается как 16 старших разрядов А19

34

– А4 начального адреса соответствующего сегмента. Младшие разряды А3 – А0 этого адреса всегда полагаются равными разрядам во время операции вычисления физического адреса. Эта операция выполняется сумматором адреса, расположенным в МП, и состоит в сложении 20-разрядного начального адреса сегмента с 16-разрядным смещением, которое дополняется четырьмя старшими разрядами А19 – А16, равными нулю. Наибольшая ёмкость памяти, отводимой под один сегмент, определяется максимальным значением 16разрядного смещения и составляет 64Кбайт.

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

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

Например, команда DEC DI уменьшает содержимое регистра DI. Непосредственная адресация. Непосредственные операнды – это по-

стоянные данные, определяемые как часть машинной команды (поле date). Данные могут быть однобайтными или двухбайтными. Непосредственные операнды могут быть выбраны быстро, так как их можно получить прямо из очереди команд без обращения к памяти. Они могут быть заданы только как операнды-источники. Если приёмником операнда служит аккумулятор, машинная команда более компактна. Например, команда CMP AL,02 (машинный код 3С02 сравнивает содержимое регистра AL с шестнадцатеричным числом 02 и устанавливает определённые флаги в соответствии с результатом сравнения. Эта команда занимает только два байта в памяти и может быть выполнена за четыре такта.

Прямая адресация. Эффективный адрес ЕА берётся непосредственно из 16-битового поля смещения машинной команды (поле disp).Этот прямой адрес определяет байт или слово памяти, расположенное внутри сегмента. По умолчанию прямая адресация приводит в сегмент данных, однако для его модификации возможно применение префиксных команд, в этом случае данные можно помещать в любой из четырёх сегментов. При использовании прямой адресации в поле mod содержится число 00, а в поле r/m – число 110 (табл. 6).

Например, пусть регистр сегмента данных содержит 04И5H, а байт 1400Н текущего сегмента данных – символическое имя ALFA. Машинная команда С606001402 (MOV ALFA, 02) предписывает запомнить по перемещаемому адресу 1400 сегмента данных шестнадцатеричное число 02.

В этой пятибайтной команде С6 – это код команды, 06 – постбайт, 0014 – смещение (disp 16) 1400Н, интерпретируемое как эффективный адрес ЕА, 02 – шестнадцатеричный операнд 02.Действительный физический 20битовый адрес здесь соответствует 05F50Н (4В50Н + 1400Н).

35

Кроме обычной прямой адресации используют два специальных вида адресации: относительную и абсолютную (или длинную) прямую адресацию.

При относительной адресации поле смещения представляется 8- битовым числом со знаком. Эффективный адрес ЕА при этом определяется в результате сложения содержимого поля смещения и регистра указателя команд IP. Относительную адресацию используют для команд условных переходов, таких, как JE (переход по равенству), JO (переход по переполнению). При использовании относительной адресации постбайт не требуется.

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

Косвенно-регистровая адресация. При этом способе в качестве эф-

фективного адреса ЕА выступает содержимое базового или индексного регистров (BX, SI или DI). Изменяя содержимое базового или индексного регистров, можно обратиться к различным участкам памяти. Можно использовать дополнительные префиксные команды для переназначения эффективного адреса в другие сегменты памяти.

При косвенной адресации существует одно исключение: для команд IMP (переход) и CALL (вызов процедур) в качестве эффективного ад-

реса может выступать содержимое любого из 16-битовых регистров общего назначения (AX, BX, CX, DX, SI, DI, BP, SP).

Например, в программе регистр DS содержит число 14С5Н, регистр SI

– число 28FFH, команда С60410 (MOV [SI], 10Н) запоминает шестнадцате ричное число 10 в байте сегмента данных с физическим адресом 1754FH (14С50Н + 28FFH).

Базовая адресация. При такой адресации эффективный адрес ЕА определяется как сумма содержимого одного из базовых регистров ВР или ВХ и смещения disp 8 или 16. При использования регистра БР за эффективный адрес принимается перемещаемый адрес теущего сегмента стека, базовый адрес которого находится в регистре сегмента стека SS.

Индексная адресация. При такой адресации эффективный адрес ЕА определяется как сумма содержимого одного из индексных регистров SI или DI и смещения disp 8 или 16.

Базово-индексная адресация. В этом случае эффективным адресом является сумма содержимого базового регистра (ВХ или ВР) и индексного регистра (SI или DI). Базово-индексная адресация является очень гибким средством доступа к самым различным участкам памяти благодаря возможности оперативного изменения содержимого базового или индексного регистров. При базово-индексной адресации поле mod = 00.

Базово-индексная адресация со смещением. При таком способе эф-

фективный адрес определяется сложением содержимого базового регистра (ВХ или ВР), индексного регистра (SI или DI) и смещения, являющегося ча-

36

стью команды. Адресуемая ячейка памяти может находиться сегменте данных или стека в зависимости от того, какой из базовых регистров используется: ВХ или ВР.

Неявная адресация. Операнд указывается первым байтом вместе с кодом операции без выделения специальных битов.

4.3. Описание команд

Система команд более подробно разобрана в методическом пособии по циклу лабораторных работ. Таблица с системой команд приведена в приложении 2.

4.3.1. Пересылка данных

Эти команды осуществляют пересылку данных из одного места в другое, запись и чтение информации из портов ввода-вывода, преобразование информации, манипуляции с адресами, обращение к стеку. Различают следующие типы пересылок: общего назначения, с участием аккумулятора, пересылка адреса операнда, флагов и стековые пересылки. Необходимо подчеркнуть, что все команды пересылок не устанавливают флаги.

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

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

Выбор подходящего формата в определённой степени может оптимизировать программу по времени её выполнения. Отметим некоторые особенности выполнения этой команды:

командой MOV нельзя осуществить пересылку из одной области памяти в другую;

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

нельзя использовать сегментный регистр CS в качестве приёмника данных, это означало бы операцию перехода в программе.

Команда XCHG применяется для двунаправленной пересылки данных. Команда может быть двух форматов, в первом случае она вызывает обмен байтами или словами между регистрами или регистром и памятью (№20 и 21 приложения), второй формат – более короткий: пересылка между одним из регистров и аккумулятором (команда № 22 приложения 1).

Примечания: при обмене нельзя использовать сегментные регистры; команду XCHG AX, AX можно применить как пустую операцию.

37

Пересылки с участием аккумулятора состоят из трёх команд: IN

(ввод), OUT (вывод) и XLAT.

Вся работа системы с внешними устройствами выполняется с использованием портов ввода-вывода. Команда IN служит для пересылки байта или слова из порта ввода в аккумулятор (в AL или AH). Номер порта ввода может быть задан как непосредственно, во втором байте команды, так и косвенно, в регистре DX (команды № 23 – № 26 в таблице системы команд). Двухбайтные команды IN А, port и OUT port,А позволяют адресоваться к 256 портам, однобайтные команды IN А,DX и OUT DX,A адресуют 65536 портов. Косвенное задание порта хотя и требует предварительной загрузки его адреса в DX, однако позволяет организовывать программные циклы, в которых используется изменяющийся адрес портов.

Команда XLAT производит замещение значения в регистре AL другим байтом из таблицы в памяти, размером не более 256 байт. Слово «таблица» весьма условно, практически это просто строка байт. Адрес байта в строке, которым будет производиться замещение содержимого регистра AL , определяется суммой (ВХ + AL), т. е. содержимое AL выполняет роль индекса в байтовом массиве. Разумеется, составляющие адресов предварительно должны быть занесены в указанные регистры. Пересылки адреса операнда. При написании программ производится активная работа с адресами операндов, находящимися в памяти. Для поддержки таких операций в процессорах I8086 есть специальная группа команд, в которую входят следующие команды: LEA (загрузка эффективного адреса в указанный регистр), LDS (загрузка указателя в DS), LES (загрузка указателя в ЕS). В более современных процессорах имеются дополнительные команды LFS и LGS (загрузка указателя в регистр дополнительного сегмента данных FS и GS), а также команда LSS (загрузка указателя в регистр сегмента стека SS). Команда LEA производит вычисление эффективного адреса ЕА и передаёт его в 16-разрядный регистр, код которого указан в поле reg. Команды LDS и LES применяются в основном при обращении к данным, находящимся вне текущих сегментов DS и ES, так что возникает необходимость изменить базовый адрес сегмента. Два 16-разрядных адреса – базовый сегментный и смещение в сегменте, называемые указателем, предварительно загружаются в память. Значение смещения содержится в двух первых байтах указателя, а базовый адрес сегмента – в третьем и четвёртом байтах. По команде LDS (или LES) происходит обращение к указателю и осуществляется загрузка регистра DS (или ES) базовым адресом. А смещение пересылается в регистр, указанный полем reg постбайта команды. Аналогичные действия производят команды LFS, LDS и LSS.

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

38

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

Группа арифметических целочисленных команд работает с двумя типами чисел:

целыми двоичными числами. Числа могут иметь знаковый разряд или не иметь такового, то есть быть числами со знаком или без знака;

целыми десятичными числами.

Целые двоичные числа с фиксированной точкой – это числа, закодированные в двоичной системе счисления. Размерность целого двоичного числа может составлять 8,16 или 32 бита. Знак двоичного числа определяется тем, как интерпретируется старший бит в представлении числа. Среди арифметических команд есть всего две команды, которые действительно учитывают этот старший разряд как знаковый, – это команды целочисленного умножения и деления IMUL и IDIV. В остальных случаях ответственность за действия со знаковыми числами и, соответственно, со знаковым разрядом ложится на программиста.

Десятичные числа – специальный вид представления информации, в основу которого положен принцип кодирования каждой десятичной цифры числа группой из четырёх бит, двоично-десятичный код (BCD – Binari-Coded Decimal). Микропроцессор хранит BCD-числа в двух форматах:

упакованный формат каждый бит содержит две десятичные цифры. Код старшей цифры числа занимает старшие 4 бита. Следовательно, диапазон представления десятичного упакованного числа в одном байте составляет от 00 до 99;

неупакованнй формат – каждый бит содержит одну десятичную цифру в четырёх младших битах. Старшие 4 бита имеют нулевое значение. Следовательно, диапазон представления неупакованного числа в одном байте составляет от 0 до 9.

Сложение двоичных чисел без знака

В системе команд микропроцессора имеются три команды двоичного сложения:

ADD операнд 1, операнд 2 – команда сложения двух операндов, результат помещается на место 1 операнда;

ADC операнд 1, операнд 2 – команда сложения с учётом флага переноса CF;

INC операнд – операция увеличения значения операнда на 1. Команда ADC является средством микропроцессора для сложения

длинных двоичных чисел.

Сложение двоичных чисел со знаком

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

39

мися числами ложится на программиста. У микропроцессора есть средства фиксирования возникновения различных ситуаций, возникающих при вычислениях, к ним относятся установка флага переноса CF, свидетельствующего о выходе за пределы разрядности операндов, и флага переполнения OF. Если рассмотреть различные варианты сложения чисел, можно выяснить, что переполнение (т. е. установка флага OF в 1) происходит при переносе:

из 14-го разряда (для положительных чисел со знаком);

из 15-го разряда (для отрицательных чисел).

Переполнения не происходит (т.е. флаг OF сбрасывается в 0), если есть

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

Команды вычитания

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

Вычитание двоичных чисел без знака

По команде SUB вычитается операнд источника из операнда приёмни-

ка.

Команда SBB используется при вычитании многобайтных чисел и учитывает флаг CF, который теперь играет роль индикатора заёма 1 из старшего разряда при вычитании чисел.

После выполнения команды вычитания чисел без знака нужно анализировать состояние флага CF. Если он установлен в 1, то это говорит о том, что произошёл заём из старшего разряда и результат получился отрицательным, т. е. в дополнительном коде.

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

Команда NEG изменяет знак операнда, причём используется представление операнда в дополнительном коде. Например, если есть операнд

– 2 (11111110), то команда NEG изменит его на +2 (00000010).

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

Вычитание двоичных чисел со знаком

При вычитании чисел со знаком, как и при сложении, необходимо анализировать значение флага переполнения OF. Если он установился в 1, значит результат вышел за диапазон представления знаковых чисел (т.е. изменился старший бит) для операнда данного размера, и программист должен предусмотреть действия по корректировке результата.

Команды умножения

В арифметических командах есть две команды умножения: MUL – умножить и IMUL – умножение со знаком. По команде MUL умножается без