Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микроконтроллеров семейства CORTEX-M. Учебное пособие
.pdf
41
ОП
LDSB Rt, [Rn, Rm]
Rt:= M[Rn+Rm]
-
Загрузка байта знаком в регистр из ОП
LDR Rt, [Rn, Imm5]
Rt:= M[Rn+4xImm8]
-
Загрузка в регистр слова из ОП
LDRH Rt, [Rn, Imm5]
Rt:= M[Rn+2xImm8]
-
Загрузка в регистр полуслова из ОП
LDRB Rt, [Rn, Imm5]
Rt:= M[Rn+Imm8]
-
Загрузка в регистр байта из ОП
STR Rt, [Rn, Imm5]
M[Rn+4xImm8]:=Rt
-
Сохранение слова в ОП из регистра
STRH Rt, [Rn, Imm5]
M[Rn+2xImm8]:=Rt
-
Сохранение полуслова из регистра в ОП
STRB Rt, [Rn, Imm5]
M[Rn+Imm8]:=Rt
-
Сохранение байта из регистра в ОП
POP {reglist}
registers := M [SP]
-
Загрузка множества регистров из стека
POP {reglist, PC}
registers, PC := M [SP]
-
Загрузка множества регистров и PC из стека
PUSH {reglist}
M [SP] := registers
-
Сохранение множества регистров в стеке
PUSH {reglist, LR}
M [SP] := registers, LR
-
Сохранение множества регистров и регитстра LR в стеке
Арифметические команды
Мнемокод
Операции
Признаки
Описание
ADDS Rd, Rn, Rm
Rd:=Rn+Rm
N,Z,C,V
Сложение регистров
SUBS Rd, Rn, Rm
Rd:=Rn-Rm
N,Z,C,V
Вычитание регистров
ADDS Rd, Rn, Imm3
Rd:=Rn+Imm3
N,Z,C,V
Сложение регистра с константой
SUBS Rd, Rn, Imm3
Rd:=Rn-Imm3
N,Z,C,V
Вычитание константы из регистра
ADDS Rdn, Imm8
Rdn:=Rdn+Imm8
N,Z,C,V
Сложение регистра с константой
SUBS Rdn, Imm8
Rdn:=Rdn-Imm8
N,Z,C,V
Вычитание константы из регистра
ADCS Rdn, Rm
Rdn=Rdn+Rm+C
N,Z,C,V
Сложение регистров с переносом
SBCS Rdn, Rm
Rdn:=Rdn-Rm-C
N,Z,C,V
Вычитание регистров с переносом
RSBS Rd, Rn, #0
Rd:= #0-Rn
N,Z,C,V
Обратное вычитание регистров
ADR Rd, PC, Imm8
Rd:=PC+4xImm8
-
Сложение программного счетчика с константой
ADD Rd, SP, Imm8
Rd:=SP+4xImm8
N,Z,C,V
Сложение указателя стека с константой
ADD SP, SP, Imm7
SP:=SP+4xImm7
N,Z,C,V
Сложение указателя стека с константой
ADD SP, SP, - Imm7
SP:=SP-4xImm7
N,Z,C,V
Вычитание константы из указателя стека
ADD Rdn, Rm
Rdn:=Rdn+Rm
N,Z,C,V
Сложение регистров
MULS Rdm, Rn, Rdm
Rdm:=Rdm x Rn
N,Z,C,V
Умножение регистров
CMP Rn, #imm8
Rd - Imm8
N,Z,C,V
Сравнение регистра с константой
CMP Rn, Rm
Rn - Rm
N,Z,C,V
Сравнение регистров
CMN Rn, Rm
Rn + Rm
N,Z,C,V
Сравнение регистров с противоположным
знаком
CMP Rn, Rm
Rn - Rm
N,Z,C,V
Сравнение регистров
Обмены с регистрами

42
Мнемокод
Операции
Признаки
Описание
MOVS Rd:, Imm8
Rd:=Imm8
N,Z,C
Загрузка константы 8 бит в регистр
MOV Rd, Rm
Rd:=Rm
N,Z,C,V
Пересылка регистров
MOV Rm, Rd
Rd:=Rm
N,Z,C
Пересылка регистров
SXTH Rd, Rm
Rd
0-31
:=Rm
0-16
-
Преобразовать полуслово со знаком в
слово
SXTB Rd, Rm
Rd
0-31
:=Rm
0-7
-
Преобразовать байт со знаком в слово
UXTH Rd, Rm
Rd
0-31
:=Rm
0-16
-
Преобразовать полуслово без знака в
слово
UXTB Rd, Rm
Rd
0-31
:=Rm
0-7
-
Преобразовать байт без знака в слово
REV Rd, Rm
Rd:=Rm с обратным порядком
байт в слове
-
Изменить на обратный порядок байтов
в полусловах
REV16
Rd:=Rm с обратным порядком
байт в полусловах
-
Изменить на обратный порядок байтов
в полусловах
REVSH Rd, Rm
Rd:=Rm с обратным порядком
байт в младшем
полуслове
-
Изменить на обратный порядок байт в
младшем полуслове, произвести распространение знакового бита в старшее
полуслово
Логические
операции
Мнемокод
Операции
Признаки
Описание
ANDS Rdn, Rm
Rdn := Rdn & Rm
N,Z,C
Логическое И
ORRS Rdn, Rm
Rdn := Rdn ˅ Rm
N,Z,C
Логическое ИЛИ
EORS Rdn, Rm
Rdn := Rdn mod2 Rm
N,Z,C
Исключающее ИЛИ (сумма по mod2)
BICS Rdn, Rm
Rdn := Rdn & not(Rm)
N,Z,C
Сброс бит по маске
TST Rn, Rm
Rm & Rn
N,Z,C
Проверка значения бит по маске
MVNS Rd, Rm
Rd := not Rm
N,Z,C
Побитовая инверсия регистра
Операции сдвига
Мнемокод
Операции
Признаки
Описание
LSLS Rd, Rm,
#<imm5>
Rd:= лог. сдвиг Rm
на Imm5 разрядов
влево
N,Z,C
Логический сдвиг Rm влево на
Imm5 ≤ 31 разрядов и запись в Rd
LSRS Rd, Rm,
#<imm5>
Rd:= лог. сдвиг Rm
на Imm5 разрядов
вправо
N,Z,C
Логический сдвиг Rm вправо на
Imm5 ≤ 31 разрядов и запись в Rd
ASRS Rd, Rm,
#<imm5>
Rd:= ариф. сдвиг
Rm на Imm5 разря-
дов вправо
N,Z,C
Арифметический сдвиг Rm вправо на
Imm5 ≤ 31 разрядов и запись в Rd
LSLS Rdn, Rm
Rdn:= лог. сдвиг
Rdn на Rm{0-7}
разрядов влево
N,Z,C
Логический сдвиг Rdn влево на число
разрядов, заданное в Rm{0-7}
LSRS Rdn, Rm
Rdn:= лог. сдвиг
Rdn на Rm{0-7}
разрядов вправо
N,Z,C
Логический сдвиг Rdn вправо на число
разрядов, заданное в Rm{0-7}
ASRS Rdn, Rm
Rdn:= ариф. сдвиг
Rdn на Rm{0-7}
разрядов вправо
N,Z,C
Арифметический сдвиг Rdn вправо на
число разрядов, заданное в Rm{0-7}

43
RORS Rdn, Rm
Rdn:= цикл. сдвиг
Rdn на Rm{0-7}
разрядов вправо
N,Z,C
Циклический сдвиг Rdn вправо на число разрядов, заданное в Rm{0-7}
Условные и безусловные переходы
Мнемокод
Операции
Признаки
Описание
BX{C} Rm
PC:=Rm
-
Безусловный или условный {c}переход
по косвенному адресу
BLX {C} Rm
LR:= PC, PC:=Rm
-
Безусловный или условный {c}переход
к подпрограмме по косвенному адресу
CBZ Rn, label
При Rn=0
PC:=PC+4+2Imm
-
Проверка регистра на 0 и условный переход относительно программного
счётчика
CBNZ Rn, label
При Rn=0
PC:=PC+4+2Imm
-
Проверка регистра на 0 и условный переход относительно программного
счётчика
B cond label
При выполнении
условия cond PC:=
PC:=PC+4+2Imm
-
Условный переход
B label
PC:=PC+4+2Imm
-
Безусловный переход
Системные команды
Мнемокод
Операции
Признаки
Описание
SVC Imm8
- Вызов супервизора
BKPT #imm8
Перевод процессора в
режим отладки
-
Точка останова
CPS {i}{f}
Изменение состояния
регистров PRIMASK,
FAULTMASK
-
Изменить состояние процессора,
запрет/разрешение прерываний
NOP
- Нет операции
WFE
- Ожидать событие
WFI
- Ожидать прерывание
SEV
- Установить признак события
В таблицах используются следующие обозначения:
в фигурных скобках {} указываются необязательные операнды;
большинство команд могут содержать суффикс кода условного выполнения
{с};
Rn, Rm, Rt, Rd – регистры, используемые в командах для задания исходных
операндов и результатов;

44
Rdn, Rdm – регистры источников и приемников операндов одновременно;
N,Z,C,V - признаки в регистре состояния программы PSR в поле APSR [1];
! – необязательный суффикс обратной записи значения базового регистра, в
случае, если он присутствует в команде (последний адрес, по которому осуществлялся доступ, будет записан обратно в регистр Rn.);
M [A] – содержимое памяти по адресу A;
S - необязательный суффикс, если он указан, результат выполнения операции
приводит к установке соответствующих флагов;
ImmX – X-разрядные константы (непосредственные операнды).
Как видно из таблиц команд, большинство команд обработки данных в
зависимости от результата изменяют значения всех или части флагов в регистре состояния прикладной программы (APSR) [1]. Предусмотрена возможность условного исполнения команд в зависимости от значения ранее сформированных флагов путем добавления суффикса условия исполнения после мнемоники команды. Перечень таких суффиксов приведен в таблице:
При наличии одного из указанных суффиксов процессор проверяет значение флагов на соответствие заданному условию. Если условие не выполняется, то команда не исполняется и не вызывает изменения операндов, флагов и не
генерирует прерываний.

45
Условные команды, за исключением условных переходов, должны располагаться внутри блока условно исполняемых инструкций (IT-блок). Такой блок
состоит и команды IT, за которой могут следовать до 4 условно исполняемых
команд.
Формат команды IT:
IT{x{y{z}}} cond
где:
cond определяет условие для первой инструкции в IT-блоке;
x - определяет выбор условия для второй инструкции в IT-блоке;
y определяет выбор условия для третьей инструкции в IT-блоке;
z определяет выбор условия для четвертой инструкции в IT-блоке.
Суффиксы выбора условия для второй, третьей и четвертой инструкций
IT-блока могут принимать одно из следующих значений:
T - Then. Инструкция выполняется, если условие cond истинно;
E - Else. Инструкция выполняется, если условие cond ложно.
Мнемокоды команд внутри IT-блока, в том числе и команд ветвления,
должны включать суффикс условного исполнения, который либо совпадает,
либо логически противоположен условию {cond}.
Пример:
ITTEE EQ ; следующие четыре инструкции - условные
MOVEQ R0, R1 ; условное копирование
ADDEQ R2, R2, #10 ; условное сложение
ANDNE R3, R3, #1 ; условное логическое И
BNE.W dloop ; условный переход. должен быть последним в блоке
4.1.5. Структура программы
Исходный текст программы ассемблера состоит из нескольких составных
частей.
Начальная часть программы с перечисление входящих в программу сек-
ций и их параметров. Каждая из секций задается директивой AREA и
описывает выделяемые области памяти для хранения программного кода
и данных, в том числе стека. Обязательно наличие хотя бы одной секции

46
stack_top
AREA STACK, READWRITE
EQU 0x400
PRESERVE8
; объявление секции стека, заполненного нулями
; начальное значение указателя стека
;выравнивание стека с кратностью 8 байт
AREA RESET, DATA, READONLY
DCD stack_top
; создание секции для размещения начальных адресов стека
;и прерывающих программ
;адрес начала обратного стека
const1
AREA Prog1, CODE, READONLY
THUMB
EQU 0xFF;
EXPORT start
;создание секции для размещения программы пользователя
;указание на использование THUMB-команд
;формирование константы const1 = 0xFF
;для доступности метки start для остальной части программы
start
ENTRY
MOVS R0,#const1
MOVS R1,#20
ADDS R2, R0, R1
PUSH {R0,R1,R2}
B .
END
;точка входа в программу пользователя (начало кода)
;метка начала программы
;загрузка в регистр R0 константы const1 = 0xFF
;загрузка в регистр R1 константы 2010
;сложение R1 и RO и загрузка суммы в регистр R2
;загрузка R2, R1, R0 в стек
;зацикливание на команде B
;конец программы
с программным кодом. В состав начальной части могут входить одна или
несколько секций программного кода с опцией только для чтения (readon-
ly) и одна или несколько секций данных с опцией для чтения и записи
(readwhrite)
Точка входа в программу, определяемая директивой ENTRY. Директива
отмечает первую инструкцию, которую нужно выполнить. Код инициали-
зации и обработчики исключений также содержат точки входа.
Строки на языке ассемблера с командами программного кода.
Конец программы (определяется директивой END). Директива END ука-
зывает ассемблеру на завершение исходной программы. Любые строки,
следующие за директивой END, игнорируются ассемблером.
Пример оформления простейшей программы:
В программе первый фрагмент AREA предназначен для создания обрат-
ного стека STACK, заполненного нулями, в памяти данных с начальным значением указателя стека Stack_Тop.
Второй фрагмент AREA задает область программной памяти, начиная с
адреса 0x08000000, для размещения директивами DCD начальных адресов стека и прерывающих программ. Здесь же при использовании стандартной программы начальной установки MDR32F9Qx.s размещаются первые исполняемые

47
команды для вызова программы Reset_Handler и пользовательской программы с
меткой Start.
Третий фрагмент AREA определяет секцию программной памяти для
размещения пользовательской программы.
Директива ENTRY задает точку входа в программу пользователя с меткой
start.
В MDK Keil предусмотрена возможность использования стандартного
макета исходной программы MDR32F9Qx.s для микроконтроллеров серии
1986ВЕ9x. Его можно найти в окне менеджера проекта во вкладке project: pro-
ject\target1\device\ startup MDR32F9Qx.s (Startup). В макете реализуется создание стека, задание начальных адресов прерывающих программ, начальная
установка контроллера и другие функции. Программа пользователя добавляется
к макету. Ниже приведена исходная программа MDR32F9Qx.s и рисунок, поясняющий ее организацию (рис.4.1).
Макет исходной программы можно разделить на следующие фрагменты:
Задание секции стека (stack)
Задание секции кучи (heap)
Таблица векторов прерываний
Код обработчика сброса (reset handler) и запуска программы пользователя
Код остальных обработчиков прерываний
Секция стека, строки 11-15
Стек организуется в памяти данных. Объем стека 400h байт задан директивой EQU. Директива AREA создает секцию с именем STACK, за которым
следуют атрибуты:
NOINIT - данные в стеке обнуляются
READWRITE - стек доступен для чтения и записи
ALIGN=3 - выравнивание стека по границе 8 байт (2
3
)

48

49

50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
