ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.02.2025
Просмотров: 9077
Скачиваний: 4
СОДЕРЖАНИЕ
2. Программная модель микропроцессора 8086
2.4. Способы задания операндов команды
3. Основные понятия языка ассемблера
3.2. Директивы определения данных
4. Сегментированная модель памяти
4.3. Общая структура программы
5.1. Соглашению по описанию команд
5.6. Команды организации циклов
5.11. Команды управления микропроцессором
7. Разработка одномодульной программы
7.1. Трансляция и компоновка программы
8. Разработка многомодульных программ
8.1. Принципы разработки модулей
8.2. Расширенное применение директивы сегментации
Программирование микропроцессорных устройств
10. Программирование системного таймера
10.1. Описание таймера-счетчика 8254
10.3. Структура регистров таймера
11. Программирование контроллера прерываний
11.1. Механизм обработки прерываний
11.4. Контроллер прерываний 8259
11.5. Идентификация прерываний
11.6. Прерывания bios и ms-dos
12. Программирование параллельного порта
12.2. Работа с параллельным портом на низком уровне
12.3. Стандартные средства работы с параллельным портом
13. Программирование последовательного порта
13.1. Основы последовательной передачи данных
13.2. Последовательный интерфейс rs-232c
13.3. Универсальный асинхронный приемо-передатчик 8250
13.4. Порты асинхронного адаптера
13.5. Стандартные средства программирования последовательного порта
Рис. 9. Регистры указателей и индексов.
Выгода от такого способа задания операнда заключается в том, что, меняя значение регистра, можно одну и ту же команду использовать для работы с разными ячейками памяти (например, при обработке массивов при доступе к разным элементам). Модификаторами могут быть только регистры ВХ, ВР, SI и DI. Модифицировать адрес можно не только по одному регистру, но и по двум сразу, в этом случае разрешено использовать не любую пару модификаторов, а только такую, где один из регистров – ВХ или ВР, а другой – SI или DI.
Регистры SI и DI используются также для поддержки цепочечных операций, т.е. операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит. Регистр SI содержит текущий адрес элемента в цепочке-источнике, а DI – текущий адрес в цепочке-приемнике.
Регистр SP используется при работе со стеком. В стековых командах предполагается, что регистр SP указывает на ячейку памяти, в которой находится элемент, записанный в стек последним.
Сегментные регистрыпредназначены для сегментирования адресов. К ним относятсясегментныерегистры кодаCS,данныхDS,стекаSS идополнительный сегментныйрегистрES (рис. 10). В регистре CS должен находиться начальный адрес сегмента команд – области памяти, где расположены команды. Регистр DS должен указывать на начало сегмента данных, в котором размещаются данные. Регистр SS должен указывать на начало области памяти, отведенной под стек.
В результате при ссылках на сегменты команд, данных и стека можно явно не указывать в командах соответствующие сегментные регистры, они будут подразумеваться по умолчанию. Дополнительный сегментный регистр ES может быть настроен на работу с любым сегментом. В микропроцессоре 386 и выше появились еще два сегментных регистра FS и GS.
Команды работают с исполнительным адресом, который совместно с содержимым сегментных регистров, участвует в формировании физического адреса.
Рис. 10. Сегментные регистры.
Регистр указателя команд содержит адрес команды, которая должна быть выполнена следующей, точнее, адрес команды, отсчитанный от начала сегмента команд, на который указывает регистр CS (рис. 11). Абсолютный адрес команды определяется регистровой парой CS:IP. Прямого доступа к регистру IP нет, т.к. его изменение есть переход. Поэтому содержимое регистров IP и CS можно менять только командами перехода.
Рис. 11. Регистр указателя команд.
Регистр флагов.Флагпредставляет собой бит, принимающий значение 1 (флаг установлен), если выполнено некоторое условие, и значение 0 (флаг сброшен) в противном случае. Всего доступно 9 флагов, причем конструктивно они собраны в один 16-разрядный регистр (регистром флагов Flags) (рис. 12).
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
|
|
|
of |
df |
if |
tf |
sf |
zf |
|
af |
|
pf |
|
cf |
Рис. 12. Структура регистра флагов.
Все флаги делятся на две группы: флаги условийифлаги состояний. Флаги условий автоматически меняются при выполнении команд и фиксируют те или иные свойства их результата. Проверка таких флагов позволяет проанализировать результат выполнения команд. К флагам условий относятся:
CF (Carry Flag) – флаг переноса используется в арифметических операциях над беззнаковыми. При переполнении разрядной сетки флаг CF устанавливается в 1. Флаг также управляется командами CLC,STCиCMC.
OF (Overflow Flag) – флаг переполнения используется в арифметических операциях над числами со знаком. Например, если при сложении или вычитании знаковых чисел получился результат, по модулю превосходящий допустимую величину (переполнение мантиссы), тогда флаг OF устанавливается в 1.
ZF (Zero Flag) – флаг нуля устанавливается в 1, если результат команды оказался нулевым.
SF (Sign Flag) – флаг знака устанавливается в 1, если в результате выполнения операции над знаковыми числами получился отрицательный результат.
PF (Parity Flag) – флаг четности равен 1, если в 8 младших битах результата очередной команды содержится четное количество двоичных единиц. Обычно учитывается в операциях ввода-вывода.
AF (Auxiliary Carry Flag) – флаг дополнительного переноса фиксирует особенности выполнения операций над двоично-десятичными числами. Флаг равен 1, если при сложении 4 младших битов (младшей тетрады) операндов сумма превышает 15 (например, в командах сложения ADD, ADC, INC) или если тетрада первого операнда меньше тетрады второго (например, в командах вычитания SUB, SBB, DEC).
Другие флаги называются флагами состояний, и менять их должна программа. Их состояние оказывает влияние на дальнейшую работу процессора. К флагам состояний относятся:
DF (Direction Flag) – флаг направления устанавливает направление просмотра строк в строковых командах. Устанавливается командами CLDиSTD. При DF=0 строки просматриваются от начала к концу, при DF=1 – в обратном направлении.
IF(InterruptFlag) – флаг прерываний устанавливается командами CLI и STI. При IF=0 процессор не реагирует на поступающие прерывания, при IF=1 блокировка снимается.
TF (Trap Flag) – флаг трассировки. При TF=1 после выполнения каждой команды процессор делает прерывание, что удобно при отладке.
Остальные биты регистра флагов не используются и их значение всегда равно 0.
2.3. Формат машинной команды
Машинная командапредставляет закодированное по определенным правилам указание на выполнение некоторой операции или действия. Структура большинства команд микропроцессора 8086 показана на рис. 13.
|
Prefixes |
Op Code |
ModeRegR/M |
SIB |
Displacement |
Immediate |
Рис. 13. Формат машинной команды.
В общем случае код команды включает:
префиксы (Prefixes) – 0–3 байта;
кода операции (Op Code) – 1 байт;
байт ModRegR/M – 1 байт;
байт масштаб-индекс-база SIB (Scale-Index-Base) – 1 байт;
отклонение (Displacement) – 0–2 байта;
непосредственный операнд (Immediate) – 0–2 байта.
В любой инструкции всегда присутствует код операции. Остальные поля используются по мере необходимости. Реальная команда может содержать не все поля и в пределе только один код операции. Опишем назначения полей машинной команды.
Префиксымодифицируют выполнение команды. Код каждого префикса занимает один байт. Микропроцессор 8086 имеет 7 префиксов, разделенных на три группы. В коде одной команды могут присутствовать до трёх префиксов, обязательно относящихся к разным группам.
В первую группу входит единственный префикс блокировки шиныLOCK (см. раздел 11). Когда он присутствует в команде, на всё время выполнения инструкции системная шина захватывается данным микропроцессором, блокируя запросы к ней со стороны других процессоров многопроцессорной системы.
Во вторую группу входят префиксы повторения операцииREP/REPE/REPZ и REPNE/REPNZ. Они используются совместно со строковыми операциями с целью обработки нескольких байтов или слов одной командой (см. раздел 7). Префиксы блокировки шины и повторения в программе на языке ассемблера располагаются непосредственно перед мнемоникой основной команды, совместно с которой они используются.
К третьей группе относятся префиксы замены сегмента.Префикс указывает на используемый для адресации в данной команде сегментный регистр (см. раздел 4). Префикс отменяет выбор сегментного регистра по умолчанию. Всего существует четыре префикса замены сегмента CS/DS/SS/ES. В отличие от префиксов других групп, префиксы замены сегмента указываются после мнемоники основной команды.
Код операциизадаёт выполняемую процессором операцию, а также может полностью или частично определять операнды, используемые в данной операции. Многие арифметико-логические инструкции способны обрабатывать данные размером байт или слово. Коды операций для этих команд отличаются значением младшего бита: нулевое значение соответствует обработке байтов, единичное – слов. В некоторых инструкциях часть кода операции входит в состав байта ModRegR/M, занимая в нём три разряда, соответствующие полю Reg.
Некоторые команды предназначены для обработки содержимого регистра общего назначения и имеют однобайтовый код операции: старшие пять разрядов задают операцию, а младшие три – номер используемого регистра. Например, инструкция DEC AX имеет код операции 48, инструкция DEC CX – код операции 49.
Байт ModRegR/Mслужит для определения расположения операндов и состоит из трёх полей (рис. 14).
|
Mod |
Reg |
R/M |
7 6 5 3 2 0
Рис. 14. Назначение разрядов байта ModRegR/M.
Поле Mod определяет местоположение одного из операндов инструкции – в регистре или в памяти. В последнем случае совместно с полем R/M поле определяет способ вычисления исполнительного адреса операнда.
Поле Reg указывает на регистр, являющийся операндом инструкции, либо является расширением кода операции. Как номер регистра-операнда поле Reg используется только в инструкциях вида «регистр-регистр» или «регистр-память». В инструкциях вида «регистр-непосредственный операнд», а также в инструкциях, имеющих только один явно заданный операнд, поле является частью кода операции.
Поле R/M содержит номер регистра-операнда инструкции, либо совместно с полем Mod определяет способ вычисления исполнительного адреса операнда, находящегося в памяти. Интерпретация поля R/M зависит от содержимого поля Mod.
Кодировка регистров общего назначения в полях Reg и R/M показана в табл. 2. Разрядность регистра (8- или 16-разрядный) зависит от разрядности выполняемой инструкции и определяется кодом операции.
Табл. 2. Коды регистров.
|
Регистр |
Код |
|
AX или AL |
000 |
|
CX или CL |
001 |
|
DX или DL |
010 |
|
BX или BL |
011 |
|
SP или AH |
100 |
|
BP или CH |
101 |
|
SI или DH |
110 |
|
DI или BH |
111 |