Микропроцессорные средства и системы. Методические указания к лабораторным работам №1-3 на стенде НТЦ-02.31.2
.pdf-rlnc – сдвиг влево без использования флага переноса;
-rrc – сдвиг вправо через флаг переноса;
-rrnc – сдвиг вправо без использования флага переноса;
-sl – сдвиг влево.
Пример применения инструкции сдвига:
mov #34, W0
lsr W0, #2, W1
В данном примере выполняется сдвиг содержимого регистра W0, которое равно 34 (0x22), на 2 позиции вправо, а результат сохраняется в регистре W1.
Таким образом, после выполнения команды lsr W0, #2, W1 в регистре W1 будет содержаться значение 8 (0x8).
Команды сравнения/выбора и условных/безусловных переходов
К группе команд сравнения/выбора относятся команды вида BTxx и CPxx, где аббревиатура BT означает «BitTest», CP означает «Compare», а сим-
волы xx — одно из условий. Команды BTxx проверяют состояние указанного бита (0 или 1) и по результатам проверки выполняют определенное действие.
Команды CPxx выполняют сравнение значений операндов, в результате чего устанавливаются флаги в регистре состояния SR процессора.
Дальнейшие действия выполняются с помощью команд условных пере-
ходов braxx, где хх — условие выполнения перехода. Команды группы услов-
ных/безусловных переходов предназначены для управления ходом вычисли-
тельного процесса и осуществляют переход к различным секциям программы по результатам проверки флагов состояния процессора. В предыдущих приме-
рах программного кода мы уже использовали некоторые из этих команд, сейчас же остановимся на них более подробно.
Наиболее широко при разработке программного обеспечения использу-
ются инструкции braxx (xx — код условия), call и goto.
21
Команда braxx осуществляет переход по адресу программы, содержаще-
муся в теле инструкции, при выполнении условия xx. В общей сложности эта команда может проверять выполнение следующих условий:
-C — установлен флаг переноса;
-GE — больше или равно;
-GEU — больше или равно для операций без знака;
-GT — больше;
-GTU — больше для операций без знака;
-LE — меньше или равно;
-LEU — меньше или равно для операций без знака;
-LT — меньше;
-LTU — меньше для операций без знака;
-N — результат предыдущей операции отрицательный;
-NC — перенос (заем) отсутствует;
-NN — результат предыдущей операции неотрицательный;
-NOV — переполнения нет;
-NZ — результат предыдущей операции ненулевой;
-OV — возникло переполнение;
-Z — установлен бит нуля в регистре состояния.
Например, команда «bra z, label1» выполнит переход на метку label1 про-
граммы, если установлен бит Z в регистре состояния процессора.
Кроме того, команда bra имеет две модификации, позволяющие выпол-
нять безусловный переход:
- bra метка, где метка должна находиться в пределах от –32768 до +32767
слов памяти программ относительно команды bra;
- braWn, где Wn — рабочий регистр.
К командам переходов относятся и команды вызова процедур call и без-
условного перехода goto. Инструкции call и goto в качестве операнда могут ис-
пользовать либо метку, либо один из рабочих регистров. Если в качестве адреса
22
перехода использовать содержимое какого-либо из рабочих регистров, то с по-
мощью одной инструкции bra или call можно организовать несколько ветвле-
ний в программе, например, по принципу оператора switch…case языка Си.
Команды работы со стеком
Программный стек управляется командами push и pop. Эти инструкции эквивалентны инструкции mov с регистром W15 в качестве указателя приёмни-
ка. Для сохранения данных в стек необходимо выполнить следующую команду:
push W0
Значение, содержащееся на вершине стека, может быть получено следу-
ющей инструкцией:
pop W0
2. Пример выполнения работы
Задача: Вычислить значение выражения (25 + 13) * (18 – 9), результаты промежуточных вычислений хранить в регистрах. Выделить младшую тетраду результата и поместить её в старшую.
Листинг программы:
mov |
#25, W0 |
; W0 = 25 |
|
|
mov |
#13, W1 |
; W1 = 13 |
|
|
add |
W0, W1, W2 |
; W2 = W0 |
+ W1 |
|
mov |
#18, W3 |
; W3 = 18 |
|
|
mov |
#9, W4 |
; W4 = 9 |
|
|
sub |
W3, W4, W5 |
; W5 |
= W3 |
- W4 |
mul.ss |
W2, W5, W6 |
; W6 |
= W2 * W5 |
|
and |
#0x000F, W6 |
; W6 |
= W6 |
& 0x000F |
sl |
W6, #12, W6 |
; W6 |
= W6 |
<< 12 |
3. Варианты индивидуальных заданий к лабораторной работе
3.1. Загрузить в регистр число 15. Сложить его с 25 и результат поместить на вершину стека. Поместить по адресу 20h внутренней памяти данных млад-
шую десятичную цифру результата, а по адресу 21h – старшую.
23
3.2. Найти разницу чисел 4836 и 2454. Младший байт результата поде-
лить на 2. Поместить по адресу 30h внутренней памяти данных младшую деся-
тичную цифру результата, а по адресу 32h – старшую.
3.3. Найти адрес ячейки памяти данных путем перемножения двух чисел
0Сh и 0Eh. В этуячейку записать результат логической операции «исключаю-
щее или» между текущим содержимым регистра W0 и числа 09h.
3.4.Найти частное чисел 236 и 59. Результат умножить на 8, используя операции сдвига. По вычисленному таким образом адресу ячейки внутренней памяти данных размесить результат двойного декремента полученного числа.
3.5.Загрузить регистр W7 числом 023h. Найти сумму W7 + 32. В ячейку внутренней памяти данных, расположенную по вычисленному таким образом адресу, загрузить число десятичных единиц результата сложения.
3.6.Вычислить значение выражения (81 + 64) * (112 - 25) OR 10011010b,
сохраняя промежуточные результаты в стеке.
3.7. Найти разницу чисел 4801 и 209. Число десятичных единиц старшего байта результата поместить в старшую тетраду порта RA. Младшую тетраду оставить без изменений.
4. Контрольные вопросы
4.1.Сколько команд включает в себя система команд микроконтроллера?
4.2.На какие группы разделены команды микроконтроллера?
4.3.Как длительность машинного цикла микроконтроллера соотносится с его тактовой частотой?
4.4.Для чего предназначены биты конфигурации микроконтроллера и в чём их особенность?
4.5.Сколько источников тактирования может иметь микроконтроллер?
4.6.Каким образом настраивается источник тактирования микроконтроллера?
4.7.Какую функцию выполняет система прерываний?
4.8.Какое событие может быть причиной возникновения прерывания?
24
Лабораторная работа №3
ИЗУЧЕНИЕ СИСТЕМЫ ПРОГРАММИРОВАНИЯ
МИКРОКОНТРОЛЛЕРОВ dsPIC33 С ПОМОЩЬЮ ЯЗЫКА
ПРОГРАММИРОВАНИЯ АССЕМБЛЕР
Цель работы
Изучить алгоритмы типовых программ обработки информации, основные правила программирования и наиболее употребительные директивы. Составить алгоритм и программу обработки, исследовать ход её выполнения.
Порядок выполнения работы:
1.Изучить основные положения и конструкции ассемблера.
2.Разработать программу в соответствии с вариантом индивидуального задания.
3.Отладить работу программы.
4.Проследить ход выполнения программы в симуляторе.
5.Оформить отчёт по лабораторной работе.
6.Ответить на контрольные вопросы.
1. Краткие теоретические сведения
1.1. Обзор MPLAB ASM30 ассемблера
Язык ассемблера – машинно-ориентированный язык низкого уровня с командами, соответствующими командам микроконтроллера.
Условно текст программы на ассемблере можно разбить на следующие секции:
-блок определений, состоящий из секций:
-подключаемых файлов;
-определения битов конфигурации;
-определения констант; -определения макросов;
25
-объявления переменных.
- блок кода, состоящий из секций: -обработчика прерываний;
-основного цикла программы;
-подпрограммы.
Таким образом, в блоке определений указывается модель используемого контроллера, подключаются заголовочные файлы, объявляются константы и переменные, содержатся иные директивы, определяющие параметры работы ассемблера и варианты сборки программы. В блоке кода содержатся непосред-
ственно исполняемые микроконтроллером инструкции, сгруппированные в подпрограммы и обработчики событий.
Пример исходного файла на языке ассемблер:
.list p=p33FJ32MC204
.include "p33FJ32MC204.inc"
.global __reset ;Метканачалакода
__reset:
main: |
|
nop |
|
goto main |
|
service: |
|
nop |
|
retfie |
|
.end |
;Конец кода |
Основу языка ассемблера составляют директивы и инструкции. Директи-
вы ассемблера интерпретируются во время выполнения работы ассемблера и используются для определения секций памяти, инициализации констант, декла-
рирования и определения символов и т.д. Инструкции являются командами микроконтроллера, непосредственно исполняются им во время работы.
26
1.2. Общий формат инструкций и директив Общий формат инструкций и директив ассемблера, следующий: [метка:] инструкция [операнды] [; комментарии]
[метка:] директива [аргументы] [; комментарии]
Таким образом, каждая строка исходного файла может содержать до че-
тырёх информационных полей:
-метка;
-мнемоника команды;
-операнды команды;
-комментарии.
Метки используются для отметки позиции в коде. Во время компоновки метки определяют адреса в памяти. Метки должны начинаться с первой колон-
ки. За меткой должно следовать двоеточие (:). Метка должна начинаться с сим-
вола латинского алфавита или символа подчёркивания (_) и может состоять из цифр и букв латинского алфавита и символа подчёркивания (_).
Мнемоники инструкций микроконтроллера, директивы ассемблера и макрокоманды должны начинаться со второй (и далее) колонки.
Операнды и аргументы следуют за мнемоникой команды. Операнды должны быть отделены от мнемоники не менее чем одним символом пробела либо табуляции. Список операндов разделяется запятыми.
Любой текст до конца строки после символа «;» трактуется как коммен-
тарий. Комментарии могут следовать за операндами, мнемониками и метками и могут начинаться в любой колонке. Строковые константы, содержащие символ
«;», как комментарий не воспринимается.
1.3 Директивы ассемблера Существует 5 основных типов директив:
- директивы контроля – управляют созданием разделов условно компили-
рованного кода;
27
-директивы данных – управляют разделением памяти и назначением символических имён переменным и константам;
-директивы листинга – определяют формат и состав файла листинга. Эти директивы позволяют указывать заголовки, нумеровать страницы и настраивать другие параметры;
-макро директивы – управляют работой макросов и распределением дан-
ных в теле макроса;
- директивы объектного файла – используются только при создании объ-
ектного файла.
Основные директивы ассемблера перечислены ниже.
.list
Директива используется для управления процессом сборки программы. В част-
ности, с помощью данной директивы можно указать используемый микроконтроллер,
систему счисления по умолчанию, параметры работы со строками и т.д. Пример:
.list p=p33fj32mc204
.include
Директива добавляет содержимое указанного файла в исходный файл.
Эффект аналогичен копированию полного текста включаемого файла в место расположения директивы. Параметр директивы – подключаемый файл – может указываться как с полным путём, так и без. Во втором случае поиск файла бу-
дет осуществляться в текущей рабочей директории, директории исходного файла и служебных директориях. Пример:
.include “p33fj32mc204.inc”
.global
Директива используется для того, чтобы позволить меткам, определён-
ным внутри файла, использоваться в другом файле. Пример:
28
.global __reset
.global __OscillatorFail
Вданномпримереметкисделаны глобальными, чтобы компоновщик ис-
пользовал их как адрес для перехода программы в указанныеточки при наступ-
лении соответствующих событий. Метка __reset используется для обозначения начала кода и используется как адрес для перехода из векторасброса.
.section
Директива декларирует секцию памяти. Атрибутами, следующими за ди-
рективой, задается расположение секции – например, в памяти RAM либо в программной памяти.
.data
Директива используется для информирования ассемблера, что последующие данные будут помещены в секцию инициализированных данных. Если адрес сек-
ции не определён, то он будет назначен автоматически при связи объектных фай-
лов.
.text
Директива используется для информирования ассемблера, что следую-
щий код будет помещён в секцию программной памяти.
.equ
Директива используется для определения символа и присвоения ему зна-
чения. Пример использования директивы:
.equ FCY, #7370000
В данном примере символу FCY присваивается литеральное значение
7370000. В таком контексте FCY является константой, которая может исполь-
зоваться в коде.
29
.hword
Директива используется для объявления инициализированных данных в пределах секции. Данные могут быть в виде констант, внутренних и внешних меток или их выражений. Пример использования директивы:
MinX: .hword 0x7FFF
.extern
Директива используется для объявления переменной либо метки, которая может использоваться в данном файле кода, однако определена как глобальная в другом файле. Пример использования директивы:
.externlabel
.end |
|
|
Директива .end используется |
для обозначения |
окончания ас- |
семблерного исходного файла. Пример использования директивы:
.list p=p33fj32mc204 ; текст программы
.end
1.4. Числовые константы и системы счисления
MPASM поддерживает шестнадцатеричную, десятичную и двоичную си-
стемы счисления. Для обозначения числового значения используется символ
«#».
Синтаксические правила числовых значений приведены в таблице 3.
|
|
|
Таблица 3 |
|
Синтаксис числовых значений |
|
|
|
|
|
|
Тип |
|
Синтаксис |
Пример |
Шестнадцатеричный |
|
0x< числовое значение > |
#0x9f |
Десятичный |
|
<числовое значение> |
#123 |
Двоичный |
|
0b<числовое значение> |
#0b11 |
|
30 |
|
|
