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

ПСМПС (лаб)

.pdf
Скачиваний:
20
Добавлен:
10.06.2015
Размер:
1.42 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

_____________________________________________________

Казанский государственный энергетический университет

В. Е. ЛЕОНТЬЕВ

Утверждено учебным управлением КГЭУ в качестве учебного пособия

для студентов

ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ МИКРОПРОЦЕССОРНЫХ СИСТЕМ

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

по курсу

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

Казань 2005

2

УДК 681.325.5 ББК 32.81

Л 47

Леонтьев В. Е.

Введение в программирование микропроцессорных систем: Лабораторный практикум / Казань: Казан. гос. энерг. ун-т, 2005.

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

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

Во второй части рассматриваются программная модель и аппаратная архитектура микроконтроллеров семейства MCS-51. В четырех лабораторных работах этого цикла даются углубленные представления о практике программирования микроконтроллеров с использованием современной среды разработки µVision2 и ассемблера A251/51 фирмы Keil Software. В практической части лабораторных работ этого цикла рассматривается примеры решения простых задач по применению микроконтроллеров.

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

__________________________________

Рецензенты Д-р. физ.-матем. наук, ведущий науч. сотрудник КазФТИ

им. Е. К. Завойского КазНЦ РАН Р. М. Баязитов

Канд. физ.-матем. наук, доцент каф. ПЭ КГЭУ Л. В. Ахметвалеева

Рекомендовано секцией РИС факультета энергомашиностроения

Председатель секции С.Р. Сидоренко

© Казанский государственный энергетический университет, 2005 г.

3

ЧАСТЬ I. ОСНОВЫ АРХИТЕКТУРЫ И ПРОГРАММИРОВАНИЯ УНИВЕРСАЛЬНЫХ МИКРОПРОЦЕССОРОВ СЕМЕЙСТВА x86

Лабораторная работа № 1

ОСНОВЫ И СИНТАКСИС ЯЗЫКА АССЕМБЛЕРА. ПРОГРАММНАЯ МОДЕЛЬ INTEL-СОВМЕСТИМОГО МИКРО-

ПРОЦЕССОРА

1. Цель работы

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

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

2.Основные теоретические сведения

Вданном разделе излагаются особенности языка ассемблера, сферы применении ассемблера для решения прикладных задач, а также базовые представления о синтаксисе и семантике этого языка программирования. Здесь также кратко рассматривается программная модель реального режима Intel-совместимого микропроцессора. Данный раздел призван восполнить возможные пробелы в самостоятельной работе студента над материалом лекционного курса.

2.1. Назначение и функции ассемблера

Ассемблер (assembler – сборщик) представляет собой низкоуровневый язык программирования, основными объектами в котором выступают аппаратные средства вычислительной системы, такие, как регистры микропроцессора, ячейки памяти и их адреса, порты ввода/вывода (т.е. регистры, физически расположенные на стороне периферийных устройств, например в контроллерах устройств ввода/вывода). Действия программы на ассемблере сводятся к манипуляции над содержимым этих объектов, а также обмену

4

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

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

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

2.2. Программная модель Intel-совместимого микропроцессора

Для понимания особенностей системы команд микропроцессора и подходов к программированию в ассемблере крайне важным является понимание программной архитектуры микропроцессора.

5

Все современные Intel-совместимые микропроцессоры реализуют 32-разрядную программную архитектуру, получившую название

Intel-архитектуры или IA-32 (Intel Architecture). Архитектура IA-32 подразу-

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

К регистрам общего назначения (general purpose registers) относятся следующие регистры (рис. 1.1): EAX – регистр-аккумулятор (accumulator), EBX – базовый регистр (base), ECX – регистр-счетчик (counter), EDX – регистр данных (data). Эти регистры могут использоваться без ограничений для любых целей – временного хранения данных, аргументов или результатов различных операций. Названия этих регистров происходят от того, что некоторые команды применяют их специальным образом: так, аккумулятор часто используется для хранения результата действий, выполняемых над двумя операндами, регистр данных в этих случаях получает старшую часть результата, если он не умещается в аккумулятор, регистр-счетчик используется как счетчик в циклах и строковых операциях, а базовый регистр используется при так называемой адресации по базе. Младшие 16 бит каждого из этих регистров могут использоваться как самостоятельные регистры и имеют имена (соответственно AX, BX, CX, DX). Ранее в процессорах 8086 – 80286 все регистры имели размер 16 бит и назывались именно так, а 32-битные появились с введением 32-битной архитектуры в 80386. Кроме этого, отдельные байты в 16-битных регистрах AX – DX тоже имеют свои имена и могут использоваться как 8-битные регистры. Старшие байты этих регистров называются

AH, BH, CH, DH, а младшие – AL, BL, CL, DL.

Другие четыре регистра общего назначения (иногда их еще называют индексными) – ESI (индекс источника), EDI (индекс приемника), EBP (указатель базы), ESP (указатель стека) – имеют более конкретное назначение и могут применяться для хранения всевозможных временных переменных, только когда они не используются по назначению. Регистры индекс источника

(source index) и индекс приемника (destination index) используются в строко-

вых операциях, указатель базы (base pointer) и указатель стека (stack pointer) используются при работе со стеком. Так же, как и случае с регистрами EAX –

6

EDX, младшие половины этих четырех регистров называются SI, DI, BP и SP соответственно.

32 бит.

 

 

 

 

 

16 бит.

31

15

7

0

EAX

 

 

AH

 

AL

 

AX

EBX

 

 

BH

 

BL

 

BX

ECX

 

 

CH

 

CL

 

CX

EDX

 

 

DH

 

DL

 

DX

ESI

 

 

 

 

 

 

SI

EDI

 

 

 

 

 

 

DI

ESP

 

 

 

 

 

 

SP

EBP

 

 

 

 

 

 

BP

Рис. 1.1. Регистры общего назначения

Как в защищенном, так в реальном режимах процессор использует встроенный механизм адресации, который получил название сегментации (segmentation). Сегментация представляет такой собой метод адресации, при котором все адресное пространство разбивается на разделы, называемые сегментами. Каждый сегмент, в общем случае, предназначен для отображения в памяти только кода программы или только данных. Типичная исполняемая программа имеет три сегмента: сегмент кода, сегмент данных и сегмент стека. Современные микропроцессоры поддерживают несколько разновидностей сегментных моделей: сегментная модель реального режима, плоская сегментная модель защищенного режима и многосегментная модель защищенного режима.

При использовании каждой из сегментированных моделей памяти для формирования любого адреса применяются два числа – адрес начала сегмента и смещение искомого байта относительно этого начала (в плоской модели памяти адреса начал всех сегментов равны). Процессор обращается к сегментам, используя вместо настоящего адреса начала сегмента 16-битное число, называемое селектором (selector). В процессорах Intel предусмотрено шесть 16-ти битных регистров — CS, DS, ES, FS, GS, SS, используемых для хранения селекторов. (Регистры FS и GS отсутствовали в 8086, но появились уже в

80286.)

В реальном режиме селектор любого сегмента равен адресу его начала, деленному на 16. Чтобы получить адрес в памяти, 16-битное смещение складывают с этим селектором, сдвинутым предварительно влево на 4 разряда (это тоже самое что умножить на 16). Таким образом, оказывается, что мак-

7

симальный доступный адрес в реальном режиме 220-1 = 1 048 575 = 1 Мб

(рис. 1.2).

адресное пространство памяти

селектор смещение

+

сегмент

*16

 

Рис. 1.2. Сегментная модель памяти реального режима

Для сравнения, в защищенном режиме адрес начала (базовый адрес) для каждого сегмента хранится отдельно в одной из двух специальных таблиц (таблицы дескрипторов сегментов). В этих таблицах может быть определено до 16384 базовых адресов сегментов, причем размер каждого из сегментов может составлять до 4 Гб логических адресов в формате сегмент:смещение. Таким образом, в защищенном режиме программам может быть доступно 246 = 64 Тб логических адресов памяти. Несмотря на это физически процессор может адресовать только 4 Гб или 64 Гб (для Pentium Pro) памяти.

Крайне важное значение для программной модели микропроцессора имеют также два служебных программно-доступных регистра: EIP (ре- гистр-счетчик команд) и EFLAFS (регистр состояния процессора). Ре- гистр-счетчик команд (instruction pointer) служит для указания смещения текущей исполняемой команды в сегменте кода программы. Регистр состояния или регистр флагов представляется в виде набора отдельных битов, состояние каждого из которых сигнализирует об особенности выполнения предыдущей команды или отражает состояние арифметико-логического устройства микропроцессора. Его младшие 16 бит называются FLAGS. В этом регистре каждый бит является флагом, то есть устанавливается в «1» при определенных условиях или его установка в «1» изменяет поведение процессора. Все флаги, расположенные в старшем слове регистра EFLAGS, имеют отношение к управлению защищенным режимом, поэтому здесь рассмотрен только регистр FLAGS (рис. 1.3).

8

15

13 12

 

 

 

 

 

 

 

 

 

0

 

0

NT

IOPL

OF

DF

IF

TF

SF

ZF

0

AF

0

PF

1

CF

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

Флаги данного регистра имеют следующее назначение:

CF – флаг переноса. Устанавливается в «1», если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0. Например, после сложения слова 0FFFFh и 1, если регистр, в который надо поместить результат, – слово, в него будет записано 0000h и флаг CF = 1.

PF – флаг четности. Устанавливается в «1», если младший байт результата предыдущей команды содержит четное число бит, равных 1; устанавливается в 0, если число единичных бит нечетное.

AF – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.

ZF – флаг нуля. Устанавливается в «1», если результат предыдущей команды – ноль.

SF – флаг знака. Этот флаг всегда равен старшему биту результата.

TF – флаг ловушки. Этот флаг был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в «1» приводит

ктому, что после выполнения каждой команды программы управление временно передается отладчику (вызывается прерывание c вектором 01h).

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

DF – флаг направления. Этот флаг контролирует поведение команд обработки строк – когда он установлен в «1», строки обрабатываются в сторону уменьшения адресов, а когда DF = 0 – наоборот.

OF – флаг переполнения. Этот флаг устанавливается в «1», если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице (то есть отрицательное), и наоборот.

флаги IOPL (уровень привилегий ввода-вывода) и NT (вложенная задача) применяются в защищенном режиме.

9

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

Организацию стека проще всего представить в виде стопки листов бумаги – класть и забирать листы бумаги можно только с вершины стопки. Если в стек записать числа 1, 2 и 3, то при чтении из стека они будут извлекаться в обратном порядке – 3, 2, 1. Стек располагается в сегменте памяти, описываемом регистром SS, а текущее смещение вершины стека указывается в регистре SP, причем при записи в стек значение этого смещения уменьшается, то есть стек растет вниз от максимально возможного адреса. Такое расположение стека «вверх ногами» необходимо, например, в плоской модели памяти защищенного режима, когда все сегменты, включая сегмент стека и сегмент кода, занимают одну и ту же область – всю память. Тогда программа исполняется в нижней области памяти, в области малых адресов, и IP растет, а стек располагается в верхней области памяти, и SP уменьшается.

2.3. Синтаксис языка ассемблера

Программа на ассемблере состоит из блоков, которые называют сегментами программы. Такие сегменты при загрузке программы отображаются на сегменты памяти. Сегмент содержит предложения языка, которые в ассемблере бывают четырех видов:

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

макрокоманды – специальное предложение, которое замещается во время трансляции другими предложениями;

директивы – представляют собой указания транслятору ассемблера на выполнение некоторых действий. Директивы не имеют соответствий командам процессора в машинном представлении, а только лишь управляют процессом трансляции;

комментарии – любые последовательности символов, в том числе и русского алфавита, игнорируемые транслятором.

Общий вид предложения программы ассемблера может быть представлен с помощью синтаксической диаграммы Бэкуса-Нуара (рис.1.4).

10

;

Директива

Комментарий

Команда

Макрокоманда

Рис. 1.4. Обобщенный формат предложений ассемблера

Директивы и команды имеют в ассемблере различный формат представления, так как выполняют разное назначение в программе. Директива в общем случае может иметь несколько операндов (рис.1.5), а команда – не более двух (рис.1.6).

Метка (label) представляет собой идентификатор, значением которого является адрес первого байта того предложения программы, которое он обозначает. Имя директивы – это идентификатор, отличающий данную директиву от других одноименных директив. Код операции и директива – это мнемонические обозначения соответствующей машинной команды, макрокоманды или директивы транслятора.

Операнды – части команды, макрокоманды или директивы ассемблера, обозначающие объекты, над которыми производятся действия.

Директива

Имя

 

Операнд 1

 

 

 

 

 

 

…. ,

;

Комментарий

Операнд n

Рис. 1.5. Формат директив ассемблера