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

Программирование микроконтроллеров семейства CORTEX-M. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
31
4. Разработка и отладка программ на языке ассемблера
в среде Keil MDK
В данном разделе приводится краткое описание правил оформления и от­ладки программ на языке ассемблера для микроконтроллеров на базе ядра ARM Cortex-M3 в интегрированной среде разработки Keil MDK. Подробное описание языка ассемблера можно найти в [3].
4.1. Язык ассемблера для микроконтроллера 1986ВЕ92QI
4.1.1. Формат строки программы
Исходный текст программы состоит из строк на языке ассемблера:
{метка} {команда | директива } {;комментарий}
Все три поля строки необязательны (здесь и далее фигурные скобки {} – признак необязательного вхождения). Возможно использование пустых строк. Длинные строки исходного текста можно разделить на несколько строк, поме­стив символ обратной косой черты (\) в конце строки. За косой чертой не долж­но быть других символов, в том числе пробелов.
Поле {метка} является символическим именем ячейки памяти, в которой хранится отмеченная меткой команда или операнд. Метка является буквенно­цифровой последовательностью, начинающейся с буквы. Допускается исполь­зование только латинского алфавита. Метка размещается в начале строки и пе­ред ней не должно быть знаков табуляции или пробелов. В конце метки воз­можно использование необязательного двоеточия. Мнемокоды команд, дирек­тив, а также мнемонические обозначения узлов микроконтроллера не могут быть использованы в качестве меток.
В поле {команда | директива} записывается мнемоническое обозначе­ние команды или директивы ассемблера. В данном пособии используется си­стема команд Thumb-2 для микроконтроллеров К1986ВЕ92QI фирмы Миландр с архитектурой v7-M Cortex-M3. Команды составляют программный код, кото­рый исполняет процессор. Команда состоит из мнемонического обозначения типа команды и операндов, участвующих в операции. Количество операндов
32
зависит от типа команды и может меняться от 0 до 3. Операнды перечисляются через запятую и могут быть заданы непосредственно числом со знаком (#), ад­ресом (прямым или косвенным) или выражением, значение которого вычисля­ются в процессе трансляции. При написании мнемоники команд, директив и символьных имен регистров могут быть использованы либо прописные, либо строчные буквы, сочетание таких букв не допускается. Директивы представля­ют собой команды управления компилятором. Команда или директива не должны находиться в первом столбце, им должен предшествовать пробел или табуляция, даже если метки нет. Некоторые директивы не допускают использо­вание метки.
Поле {;комментарий} - это последняя часть ассемблерной строки, кото­рой должна предшествовать точка с запятой. Концом комментария является ко­нец текстовой строки. Допускаются ассемблерные строки только с полем ком­ментария. Основное назначение комментария - пояснения к строке или про­граммы в целом.
Пример строки:
Label2: MOV R3,#48; загрузка константы
В строке задана метка Label2 и выполняется команда загрузки непо­средственного операнда 48 в регистр R3 с комментарием (загрузка константы).
При написании строк исходной программы необходимо использовать
символы, правила и ограничения, принятые в ассемблере [3] (см. окно мене-
джера проекта, вкладка Books). В данном пособии используется подмножество языка ассемблера, близкое к машинному языку процессорного ядра микро­контроллера. При этом использование директив ограничивается минимальным набором, необходимым для создания программы (см. ниже). Исключаются сложные способы представления переменных, адресов и констант и их комби­наций для создания числовых или строковых выражений.
33
4.1.2. Символы, литералы, выражения и операторы
Ниже приводятся правила использования символы для представления переменных, адресов и констант в исходном коде.
Символы
При использовании символов в исходном коде на языке ассемблера необ-
ходимо соблюдать следующие основные правила написания. Имена символов должны быть уникальными в пределах своей области дей-
ствия.
В именах символов могут использоваться прописные буквы, строчные бук-
вы, цифровые символы и символ подчеркивания.
Числовые символы не используются в качестве первого символа имени
символ.
В качестве символов не допускается использование имен встроенных пере-
менных или предопределенные имена символов.
В качестве программных меток не допускается использование символов | $ a
|, | $ t |, | $ t.x | или | $ d |, обозначающих начало с командами ARM, Thumb, ThumbEE и данных в объектном файле.
Переменные
С помощью директив ассемблера можно объявлять числовые, логиче­ские или строковые переменные. Значение переменной можно изменить в про­цессе сборки. В сгенерированном коде или данных каждый экземпляр пере­менной имеет фиксированное значение. Переменные являются локальными для ассемблера. Диапазон возможных значений числовой переменной такой же, как диапазон возможных значений числовой константы или числового выражения связанных с ней.
Возможные значения логической переменной: {TRUE} или {FALSE}. Диапазон возможных значений строковой переменной такой же, как диапазон значений строкового выражения.
34
тип
цифры
примеры записи
десятичные
от 0 до 9
2020
шестнадцатеричные
от 0 до 9, A, B, C, D, E, F
0х7E4, &7E4
с основанием n
0 до (n –1), где 2 ≤ n ≤ 9
8_3744
двоичные
0, 1
2_10111110100
Числовые константы
Числовые константы - это 32-битные целые числа, представляемые в беззна­ковом формате в диапазоне от 0 до 232-1, либо со знаком в диапазоне от -231 до 231-1. Константы определяются с помощью директивы ассемблера EQU. После определения константы изменить ее значение невозможно. Операторы отношения, такие как> =, используют беззнаковую интерпретацию. Это означа­ет, что 0> -1 равно {FALSE}.
Числовые литералы
Числовые литералы используются для записи чисел. Числовые литера-
лы состоят из последовательности символов или одного символа в кавычках, определяющих число. Для задания целых чисел могут использоваться следую­щие формы:
Операторы
Арифметические операторы:
* - умножение
/ - деление
:MOD: - получение остатка от деления (Пример: A:MOD:B)
+ - сложение
- - вычитание
Логические операторы:
:AND: - побитовое И
:EOR: - побитовое исключающее ИЛИ
:OR: - побитовое ИЛИ
Операторы сдвига:
35
:ROL: - циклический сдвиг влево
:ROR: - циклический сдвиг вправо
:SHL: - сдвиг влево :SHR: - сдвиг вправо (SHR представляет собой логический сдвиг и не
распространяет знаковый бит)
Пример записи: A:SHL:B - сдвиг влево числа A на B бит.
Операторы сравнения:
= - равно
> - больше
>= - больше либо равно
< - меньше
<= - меньше либо равно
/= - не равно
Булевы операторы:
(для логических переменных со значениями {TRUE} или {FALSE})
:LAND: - логическое И
:LEOR: - логическое исключающее ИЛИ
:LOR: - логическое ИЛИ
4.1.3. Директивы ассемблера
Директивы не транслируются в машинные коды и используются ассем­блером в служебных целях (присвоение константам символьных имён, разметка программы и т.д.). В ассемблере для микроконтроллеров CORTEX-M3 преду­смотрено около 70 различных директив [3]. Ниже приводится описание дирек­тив, используемых в данном пособии.
Директива AREA
Директива AREA предназначена для создания секций программного кода или данных, образующих программу. Секции - это независимые, именованные,
неделимые фрагменты кода или данных.
Формат директивы:
36
AREA sectionname {, attr} {, attr} ...
где: sectionname - имя секции. Имена секций должны начинаться с буквен- ного символа.
attr - один или несколько атрибутов секции, разделенных запятыми. Ниже перечислены основные используемые атрибуты:
CODE – секция содержит программный код, по умолчанию используется с ат­рибутом READONLY.
READONLY – секция размещается в памяти, допускающей только чтение. DATA – секция содержит только данные, по умолчанию используется с атри-
бутом READWRITE.
READWRITE - секция размещается в памяти, допускающей запись и чтение. NOINIT – блок памяти, задаваемый директивами SPACE, DCD, заполняет
ся нулями
Пример:
AREA Programm1 CODE READONLY ; Пример описания программной
секции
Директива SPACE
Директива резервирует блок памяти, заполненный нулями. Формат директивы:
{label} SPACE expr {label} – необязательная метка expr - выражение, определяющее количество байт в блоке памяти, заполняе-
мом нулями Пример:
AREA Mem1, DATA, READWRITE ; открытие секции Mem1 SPACE 255 ; задан заполненный нулями блок памяти 255 байт с именем
Mem1
37
Директива DCD
Директива DCD выделяет одно или несколько слов в памяти с выравни­ванием по четырехбайтовым границам и определяет начальное содержимое па­мяти при запуске программы. Формат директивы:
{label} DCD expr{,expr}
где: {label} - необязательная метка
expr – выражение, определяющее число
Примеры:
data1 DCD 3,8,30 ; Определяет 3 слова, содержащие числа 3, 8, 30 data2 DCD point1 + 8 ; Определяет 1 слово, содержащее число 8+адрес метки point1
Директива EQU
Задает символическое имя числовой константе. Формат директивы:
name EQU expr
name – символическое имя, присвоенное числовой константе. expr - 32- разрядная целочисленная константа
Примеры:
abc EQU 2 ; константе 2 присвоено символическое имя abc. xyz EQU label+8 ; константе, равной адресу метки + 8 (label+8), присвое-
но имя xyz
Директива ENTRY
Директива определяет точку входа в программу Формат директивы: ENTRY
Пример:
38
AREA Exp1, CODE, READONLY ENTRY ; точка входа в программу. ; текст программы END
Директива END
Директива информирует ассемблер о достижении конца текста исходной программы Формат директивы: END
Директива PRESERVE8
Директива задает 8-байтовое выравнивание стека
Формат директивы: PRESERVE8
Директива PROC
Директива предназначена для обозначения начала подпрограммы
Формат директивы: PROC
Директива ENDP
Директива предназначена для обозначения конца подпрограммы
Формат директивы:
ENDP
Директива THUMB
Директива информирует ассемблер о том, что следующие за директивой команды следует интерпретировать как THUMB команды. Аналогично дирек­тива ARM указывает на следующие за ней ARM команды.
39
Формат директивы: THUMB
Директива EXPORT
Директива EXPORT объявляет символ, который может использоваться
линкером для разрешения ссылок на символ в объектных и библиотечных фай­лах.
Формат директивы: EXPORT symbol EXPORT symbol [WEAK]
Symbol - имя символа для экспорта
[WEAK] - символ импортируется другими источниками, только если никакой другой источник не экспортирует альтернативный Symbol.
Директива IMPORT
Директива IMPORT предоставляют ассемблеру имя, которое не опреде- лено в текущем объекте.
Формат директивы:
IMPORT symbol
4.1.4. Система команд
В микроконтроллерах на базе архитектуры ARM используются не­сколько вариантов систем команд:
ARM - 32-разрядные команды Thumb - 16-разрядные команды Thumb-2 - сочетание 32-разрядных и 16-разрядных команд В программах для микроконтроллеров К1986ВЕ92QI фирмы Миландр с
архитектурой v7-M Cortex-M3 используется система команд Thumb-2. Коман­ды, задаваемые в исходной программе, могут интерпретироваться ассемблером в формате как 16 бит, так и 32 бита. Команды можно свободно перемешивать.
40
Обмены с памятью
Мнемокод
Операции
При-
знаки
Описание
LDMIA Rn{!}, {reglist}
registers := M [Rn]
-
Загрузка множества регистров из ОП, ин­кремент Rn после доступа
STMIA Rn{!}, {reglist}
M [Rn] := registers
-
Сохранение множества регистров в ОП, инкремент Rn после доступа
LDR Rt, Imm8
Rt:= M[PC+4xImm8]
-
Загрузка в регистр слова из ОП относи­тельно программного счетчика
LDR Rt, Imm8
Rt:= M[SP+4xImm8]
-
Загрузка в регистр слова из ОП относи­тельно указателя стека
STR Rt, Imm8
M[SP+4xImm8]:= Rt
-
Сохранение слова из регистра в ОП отно­сительно указателя стека
LDR Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
-
Загрузка в регистр слова из ОП
STR Rt, [Rn, Rm]
M[Rn+Rm] :=Rt
-
Сохранение слова из регистра в ОП
LDRH Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
-
Загрузка в регистр полуслова из ОП
STRH Rt, [Rn, Rm]
M[Rn+Rm] :=Rt
-
Сохранение полуслова из регистра в ОП
LDRB Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
-
Загрузка в регистр байта из ОП
STRB Rt, [Rn, Rm]
M[Rn+Rm] :=Rt
-
Сохранение байта из регистра в ОП
LDSH Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
-
Загрузка в регистр полуслова со знаком из
Команды с одинаковыми операциями наиболее эффективно выполняются с ис­пользованием 16-битной кодировки.
Для явного указания ассемблеру разрядности команды могут использо­ваться суффиксы .w и .n, помещаемые сразу после мнемонического обозначе-
ние команды или после необязательного суффикса установки флагов. Суффикс
.w заставляет ассемблер генерировать 32-битный код команды, даже если до­ступно 16-битное кодирование. Суффикс .n заставляет ассемблер генерировать 16-битный код команды. В том случае, если команда не может быть закодиро­вана в 16 бит, ассемблер генерирует ошибку. Например, для команды mov.w r1,r2 компилятор сгенерирует 32-битный код, а для команды mov.n r1,r2 — 16­битный. В данном пособии рассматривается использование только 16-разрядных команд, краткое описание которых приведено в таблицах. Более подробную информацию можно найти в [4, 5]
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]