Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микроконтроллеров семейства CORTEX-M. Учебное пособие
.pdf
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]
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
