ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.02.2025

Просмотров: 9077

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Системное программирование

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

2. Программная модель микропроцессора 8086

2.1. Представление информации

2.2. Регистры микропроцессора

2.3. Формат машинной команды

2.4. Способы задания операндов команды

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

3. Основные понятия языка ассемблера

3.1. Предложения

3.2. Директивы определения данных

3.3. Выражения

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

4. Сегментированная модель памяти

4.1. Сегментирование адресов

4.2. Директивы сегментации

4.3. Общая структура программы

4.4. Модели памяти

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

5. Основные группы команд

5.1. Соглашению по описанию команд

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

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

5.4. Логические команды

5.5. Команды переходов

5.6. Команды организации циклов

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

5.8. Стековые команды

5.9. Команды ввода-вывода

5.10. Команды прерываний

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

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

6. Подпрограммы

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

7. Разработка одномодульной программы

7.1. Трансляция и компоновка программы

7.2. Отладка программы

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

8. Разработка многомодульных программ

8.1. Принципы разработки модулей

8.2. Расширенное применение директивы сегментации

9. Упражнения

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

Программирование микропроцессорных устройств

10. Программирование системного таймера

10.1. Описание таймера-счетчика 8254

10.2. Режимы работы таймера

10.3. Структура регистров таймера

10.4. Упражнения

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

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

11.1. Механизм обработки прерываний

11.2. Типы прерываний

11.3. Приоритеты прерываний

11.4. Контроллер прерываний 8259

11.5. Идентификация прерываний

11.6. Прерывания bios и ms-dos

11.7. Упражнения

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

12. Программирование параллельного порта

12.1. Интерфейс Centronics

12.2. Работа с параллельным портом на низком уровне

12.3. Стандартные средства работы с параллельным портом

12.4. Упражнения

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

13. Программирование последовательного порта

13.1. Основы последовательной передачи данных

13.2. Последовательный интерфейс rs-232c

13.3. Универсальный асинхронный приемо-передатчик 8250

13.4. Порты асинхронного адаптера

13.5. Стандартные средства программирования последовательного порта

13.6. Упражнения

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

Литература

141 Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета

Рис. 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