4. Краткое описание набора инструкций ядра ARM7TDMI
В данном разделе приводится описание наборов инструкций процессора ARM7TDMI.
4.1 Краткое описание формата
В данном разделе представлено краткое описание наборов инструкций ARM и Thumb.
Ключ к таблицам наборов инструкций представлен в таблице 1.1.
Процессор ARM7TDMI выполнен на основе архитектуры ARMv4T. Более полное описание обоих наборов инструкций представлено в "ARM Architecture Reference Manual".
Таблица 1.1. Ключ к таблицам
Тип |
Описание |
{cond} |
Поле условия, см. таблицу 1.6. |
<Oprnd2> |
Операнд 2, см. таблицу 1.4. |
{field} |
Поле управления, см. таблицу 1.5. |
S |
Устанавливает коды условия, опционально. |
B |
Операция над байтами, опционально. |
H |
Операция над полусловами, опционально. |
T |
Принудительная трансляция адреса. Не может использоваться с предварительно индексированными адресами. |
Режимы адресации |
См. Режимы адресации. |
#32bit_Imm |
32-разрядная константа, полученная путем сдвига вправо 8-разрядного значения на четное количество бит. |
<reglist> |
Список регистров, разделенных запятой, в фигурных скобках ( { and } ). |
Форматы набора инструкций ARM показаны на рисунке 1.5.
Более детальная информация относительно форматов набора инструкций ARM приведена в "ARM Architectural Reference Manual".
 Рисунок 1.5. Форматы набора инструкций ARM
Прим.:
Некоторые коды инструкций не определены, но они не вызывают поиска неопределенных инструкций, например, инструкция умножения с битом 6 измененным к 1. Запрещается использовать такие инструкции, т.к. в будущем их действие может быть изменено. Результат выполнения данных кодов инструкций в составе процессора ARM7TDMI непредсказуем.
4.2 Краткое описание инструкций ARM
Набор инструкций ARM представлен в таблице 1.2.
Таблица 1.2. Краткое преставление инструкций ARM
Операции |
|
Синтаксис Ассемблера |
Пересылка |
Пересылка |
MOV {cond}{S} Rd, <Oprnd2> |
Пересылка NOT |
MVN {cond}{S} Rd, <Oprnd2> |
Пересылка SPSR в регистр |
MRS {cond} Rd, SPSR |
Пересылка CPSR в регистр |
MRS {cond} Rd, CPSR |
Пересылка регистра SPSR |
MSR {cond} SPSR{field}, Rm |
Пересылка CPSR |
MSR {cond} CPSR{field}, Rm |
Пересылка константы во флаги SPSR |
MSR {cond} SPSR_f, #32bit_Imm |
Пересылка константы во флаги CPSR |
MSR {cond} CPSR_f, #32bit_Imm |
Арифметические |
Сложение |
ADD {cond}{S} Rd, Rn, <Oprnd2> |
Сложение с переносом |
ADC {cond}{S} Rd, Rn, <Oprnd2> |
Вычитание |
SUB {cond}{S} Rd, Rn, <Oprnd2> |
Вычитание с переносом |
SBC {cond}{S} Rd, Rn, <Oprnd2> |
Вычитание обратного вычитания |
RSB {cond}{S} Rd, Rn, <Oprnd2> |
Вычитание обратного вычитания с переносом |
RSC {cond}{S} Rd, Rn, <Oprnd2> |
Умножение |
MUL {cond}{S} Rd, Rm, Rs |
Умножение-накопление |
MLA {cond}{S} Rd, Rm, Rs, Rn |
Умножение длинных беззнаковых чисел |
UMULL {cond}{S} RdLo, RdHi, Rm, Rs |
Умножение - беззнаковое накопление длинных значений |
UMLAL {cond}{S} RdLo, RdHi, Rm, Rs |
Умножение знаковых длинных |
SMULL {cond}{S} RdLo, RdHi, Rm, Rs |
Умножение - знаковое накопление длинных значений |
SMLAL {cond}{S} RdLo, RdHi, Rm, Rs |
Сравнение |
CMP {cond} Rd, <Oprnd2> |
Сравнение отрицательное |
CMN {cond} Rd, <Oprnd2> |
Логические |
Проверка |
TST {cond} Rn, <Oprnd2> |
Проверка на эквивалентность |
TEQ {cond} Rn, <Oprnd2> |
Лог. И |
AND {cond}{S} Rd, Rn, <Oprnd2> |
Искл. ИЛИ |
EOR {cond}{S} Rd, Rn, <Oprnd2> |
ORR |
ORR {cond}{S} Rd, Rn, <Oprnd2> |
Сброс бита |
BIC {cond}{S} Rd, Rn, <Oprnd2>> |
Переход |
Переход |
B {cond} label |
Переход по ссылке |
BL {cond} label |
Переход и изменение набора инструкций |
BX {cond} Rn |
Чтение |
слова |
LDR {cond} Rd, <a_mode2> |
слова с преимуществом режима пользователя |
LDR {cond}T Rd, <a_mode2P> |
байта |
LDR {cond}B Rd, <a_mode2> |
байта с преимуществом режима пользователя |
LDR {cond}BT Rd, <a_mode2P> |
байта со знаком |
LDR {cond}SB Rd, <a_mode3> |
полуслова |
LDR {cond}H Rd, <a_mode3> |
полуслова со знаком |
LDR {cond}SH Rd, <a_mode3> |
операции с несколькими блоками данных |
- |
с предварительным инкрементом |
LDM {cond}IB Rd{!}, <reglist>{^} |
с последующим инкрементом |
LDM {cond}IA Rd{!}, <reglist>{^} |
с предварительным декрементом |
LDM {cond}DB Rd{!}, <reglist>{^} |
с последующим декрементом |
LDM {cond}DA Rd{!}, <reglist>{^} |
операция над стеком |
LDM {cond}<a_mode4L> Rd{!}, <reglist> |
операция над стеком и восстановление CPSR |
LDM {cond}<a_mode4L> Rd{!}, <reglist+pc>^ |
операция над стеком с регистрами пользователя |
LDM {cond}<a_mode4L> Rd{!}, <reglist>^ |
Запись |
слова |
STR {cond} Rd, <a_mode2> |
слова с преимуществом режима пользователя |
STR {cond}T Rd, <a_mode2P> |
байта |
STR {cond}B Rd, <a_mode2> |
байта с преимуществом режима пользователя |
STR {cond}BT Rd, <a_mode2P> |
полуслова |
STR {cond}H Rd, <a_mode3> |
операции над несколькими блоками данных |
- |
с предварительным инкрементом |
STM {cond}IB Rd{!}, <reglist>{^} |
с последующим инкрементом |
STM {cond}IA Rd{!}, <reglist>{^} |
с предварительным декрементом |
STM {cond}DB Rd{!}, <reglist>{^} |
o с последующим декрементом |
STM {cond}DA Rd{!}, <reglist>{^} |
операция над стеком |
STM {cond}<a_mode4S> Rd{!}, <reglist> |
операция над стеком с регистрами пользователя |
STM {cond}<a_mode4S> Rd{!}, <reglist>^ |
Обмен |
слов |
SWP {cond} Rd, Rm, [Rn] |
байт |
SWP {cond}B Rd, Rm, [Rn] |
Сопроцессор |
Операция над данными |
CDP {cond} p<cpnum>, <op1>, CRd, CRn, CRm, <op2> |
Пересылка в ARM-регистр из сопроцессора |
MRC {cond} p<cpnum>, <op1>, Rd, CRn, CRm, <op2> |
Пересылка в сопроцессор из ARM-регистра |
MCR {cond} p<cpnum>, <op1>, Rd, CRn, CRm, <op2> |
Чтение |
LDC {cond} p<cpnum>, CRd, <a_mode5> |
Запись |
STC {cond} p<cpnum>, CRd, <a_mode5> |
Программное прерывание |
SWI 24bit_Imm |
Подробно ознакомиться с системой команд в режиме ARM можно здесь.
Режимы адресации
Режимы адресации - процедуры, которые используются различными инструкциями для генерации значений, используемых инструкциями. Процессор ARM7TDMI поддерживает 5 режимов адресации:
- Режим 1 - Сдвиговые операнды для инструкций обработки данных.
- Режим 2 - Чтение и запись слова или беззнакового байта.
- Режим 3 - Чтение и запись полуслова или загрузка знакового байта.
- Режим 4 - Множественные чтение и запись.
- Режим 5 - Чтение и запись сопроцессора.
Режимы адресации с указанием их типов и мнемонических кодов представлены в таблице 1.3.
Таблица 1.3. Режимы адресации
Режим адресации |
Тип или режим адресации |
Мнемонический код или тип стека |
Режим 2 <a_mode2> |
Константа смещения |
[Rn, #+/-12bit_Offset] |
Регистр смещения |
[Rn, +/-Rm] |
Масштабный регистр смещения |
[Rn, +/-Rm, LSL #5bit_shift_imm] |
[Rn, +/-Rm, LSR #5bit_shift_imm] |
[Rn, +/-Rm, ASR #5bit_shift_imm] |
[Rn, +/-Rm, ROR #5bit_shift_imm] |
[Rn, +/-Rm, RRX] |
Предварительное индексированное смещение |
- |
Константа |
[Rn, #+/-12bit_Offset]! |
Регистр |
[Rn, +/-Rm]! |
Масштабный регистр |
[Rn, +/-Rm, LSL #5bit_shift_imm]! |
[Rn, +/-Rm, LSR #5bit_shift_imm]! |
[Rn, +/-Rm, ASR #5bit_shift_imm]! |
[Rn, +/-Rm, ROR #5bit_shift_imm]! |
[Rn, +/-Rm, RRX]! |
Смещение с последующим индексированием |
- |
Константа |
[Rn], #+/-12bit_Offset |
Регистр |
[Rn], +/-Rm |
Масштабный регистр |
[Rn], +/-Rm, LSL #5bit_shift_imm |
[Rn], +/-Rm, LSR #5bit_shift_imm |
[Rn], +/-Rm, ASR #5bit_shift_imm |
[Rn], +/-Rm, ROR #5bit_shift_imm |
[Rn, +/-Rm, RRX] |
Режим 2, привилегированный <a_mode2P> |
Константа смещения |
[Rn, #+/-12bit_Offset] |
Регистр смещения |
[Rn, +/-Rm] |
Масштабный регистр смещения |
[Rn, +/-Rm, LSL #5bit_shift_imm] |
[Rn, +/-Rm, LSR #5bit_shift_imm] |
[Rn, +/-Rm, ASR #5bit_shift_imm] |
[Rn, +/-Rm, ROR #5bit_shift_imm] |
[Rn, +/-Rm, RRX] |
Смещение с последующим индексированием |
- |
Константа |
[Rn], #+/-12bit_Offset |
Регистр |
[Rn], +/-Rm |
Масштабный регистр |
[Rn], +/-Rm, LSL #5bit_shift_imm |
[Rn], +/-Rm, LSR #5bit_shift_imm |
[Rn], +/-Rm, ASR #5bit_shift_imm |
[Rn], +/-Rm, ROR #5bit_shift_imm |
[Rn, +/-Rm, RRX] |
Режим 3, <a_mode3>> |
Константа смещения |
[Rn, #+/-8bit_Offset] |
Предварительное индексирование |
[Rn, #+/-8bit_Offset]! |
Последующее индексирование |
[Rn], #+/-8bit_Offset |
Регистр |
[Rn, +/-Rm] |
Предварительное индексирование |
[Rn, +/-Rm]! |
Последующее индексирование |
[Rn], +/-Rm |
Режим 4, чтение <a_mode4L> |
IA, последующий инкремент |
FD, full descending |
IB, предварительный инкремент |
ED, empty descending |
DA, последующий декремент |
FA, full ascending |
DB предварительный декремент |
EA, empty ascending |
Режим 4, запись <a_mode4S> |
IA, последующий инкремент |
FD, full descending |
IB, предварительный инкремент |
ED, empty descending |
DA, последующий декремент |
FA, full ascending |
DB предварительный декремент |
EA, empty ascending |
Режим 5, передача данных сопроцессора <a_mode5> |
Константа смещения |
[Rn, #+/-(8bit_Offset*4)] |
Предварительное индексирование |
[Rn, #+/-(8bit_Offset*4)]! |
Последующее индексирование |
[Rn], #+/-(8bit_Offset*4) |
Операнд 2
Операнд является частью инструкции, которая ссылается на данные или периферийное устройство. Операнды 2 представлены в таблице 1.4.
Таблица 1.4. Операнд 2
Операнд |
Тип |
Мнемонический код |
Операнд 2 <Oprnd2> |
Значение константы |
#32bit_Imm |
Логический сдвиг влево |
Rm LSL #5bit_Imm |
Логический сдвиг вправо |
Rm LSR #5bit_Imm |
Арифметический сдвиг вправо |
Rm ASR #5bit_Imm |
Вращение вправо |
Rm ROR #5bit_Imm |
Регистр |
Rm |
Логический сдвиг влево |
Rm LSL Rs |
Логический сдвиг вправо |
Rm LSR Rs |
Арифметический сдвиг вправо |
Rm ASR Rs |
Вращение вправо |
Rm ROR Rs |
Расширенное вращение вправо |
Rm RRX |
Поля
Поля представлены в таблице 1.5.
Таблица 1.5. Поля
Тип |
Суффикс |
Установки |
Бит |
Поле {field} |
_c |
Бит-маска поля управления |
3 |
_f |
Бит-маска поля флагов |
0 |
_s |
Бит-маска поля статуса |
1 |
_x |
Бит-маска поля расширения |
2 |
Поля условий
Поля условий представлены в таблице 1.6.
Таблица 1.6. Поля условий
Тип поля |
Суффикс |
Описание |
Условие |
Условие {cond} |
EQ |
Равно |
Z=1 |
NE |
Неравно |
Z=0 |
CS |
Беззнаковое больше или равно |
C=1 |
CC |
Беззнаковое меньше |
C=0 |
MI |
Отрицательное |
N=1 |
PL |
Положительное или ноль |
N=0 |
VS |
Переполнение |
V=1 |
VC |
Нет переполнения |
V=0 |
HI |
Беззнаковое больше |
C=1, Z=0 |
LS |
Беззнаковое меньше или равно |
C=0, Z=1 |
GE |
Больше или равно |
N=V (N=V=1 или N=V=0) |
LT |
Меньше |
N<>V (N=1 и V=0) или (N=0 и V=1) |
GT |
Больше |
Z=0, N=V (N=V=1 или N=V=0) |
LE |
Меньше или равно |
Z=0 или N<>V (N=1 и V=0) или (N=0 и V=1) |
AL |
Всегда истинный |
флаги игнорируются |
4.3 Краткое описание набора инструкций Thumb
Форматы набора инструкций Thumb показаны на рисунке 1.6. Более подробная информация по форматам наборов инструкций ARM приведена "ARM Architectural Reference Manual".
 Рисунок 1.6. Форматы набора инструкций Thumb
Набор инструкций Thumb представлен в таблице 1.7.
Таблица 1.7. Краткое описание набора инструкций Thumb
Операция |
Синтаксис Ассемблера |
Пересылка (копирование) |
константы |
MOV Rd, #8bit_Imm |
старшего в младший |
MOV Rd, Hs |
младшего в старший |
MOV Hd, Rs |
старшего в старший |
MOV Hd, Hs |
Арифметические |
сложение |
ADD Rd, Rs, #3bit_Imm |
прибавить младший к младшему |
ADD Rd, Rs, Rn |
прибавить старший к младшему |
ADD Rd, Hs |
прибавить младший к старшему |
ADD Hd, Rs |
прибавить старший к старшему |
ADD Hd, Hs |
сложение с константой |
ADD Rd, #8bit_Imm |
прибавить значение к SP |
ADD SP, #7bit_Imm ADD SP, #-7bit_Imm |
сложение с учетом переноса |
ADC Rd, Rs |
вычитание |
SUB Rd, Rs, Rn SUB Rd, Rs, #3bit_Imm |
вычитание константы |
SUB Rd, #8bit_Imm |
вычитание с переносом |
SBC Rd, Rs |
инверсия знака |
NEG Rd, Rs |
умножение |
MUL Rd, Rs |
сравнить младший с младшим |
CMP Rd, Rs |
сравнить младший и старший |
CMP Rd, Hs |
сравнить старший и младший |
CMP Hd, Rs |
сравнить старший и старший |
CMP Hd, Hs |
сравнить отрицательные |
CMN Rd, Rs |
сравнить с константой |
CMP Rd, #8bit_Imm |
Логические |
И |
AND Rd, Rs |
Искл. ИЛИ |
EOR Rd, Rs |
ИЛИ |
ORR Rd, Rs |
Сброс бита |
BIC Rd, Rs |
Пересылка NOT |
MVN Rd, Rs |
Тестирование бит |
TST Rd, Rs |
Сдвиг/вращение |
Логический сдвиг влево |
LSL Rd, Rs, #5bit_shift_imm LSL Rd, Rs |
Логический сдвиг вправо |
LSR Rd, Rs, #5bit_shift_imm LSR Rd, Rs |
Арифметический сдвиг вправо |
ASR Rd, Rs, #5bit_shift_imm ASR Rd, Rs |
Вращение вправо |
ROR Rd, Rs |
Переход |
условные переходы |
- |
Z =1 |
BEQ label |
Z =0 |
BNE label |
С =1 |
BCS label |
С =0 |
BCC label |
N =1 |
BMI label |
N =0 |
BPL label |
V =1 |
BVS label |
V =0 |
BVC label |
C=1, Z=0 |
BHI label |
C=0, Z=1 |
BLS label |
N=1, V=1 или N=0, V=0 |
BGE label |
N=1, V=0 или N=0, V=1 |
BLT label |
Z=0 и ((N или V=1) или (N или V=0)) |
BGT label |
Z=1 или ((N=1 или V=0) или (N=0 и V=1)) |
BLE label |
Безусловный переход |
B label |
Длинный переход по ссылке |
BL label |
Опциональное изменение состояния |
- |
по адресу в мл. регистре |
BX Rs |
по адресу в ст. регистре |
BX Hs |
Чтение |
с константой смещения |
- |
слова |
LDR Rd, [Rb, #7bit_offset] |
полуслова |
LDRH Rd, [Rb, #6bit_offset] |
байта |
LDRB Rd, [Rb, #5bit_offset] |
с регистром смещения |
- |
слова |
LDR Rd, [Rb, Ro] |
полуслова |
LDRH Rd, [Rb, Ro] |
знакового полуслова |
LDRSH Rd, [Rb, Ro] |
байт |
LDRB Rd, [Rb, Ro] |
знакового байта |
LDRSB Rd, [Rb, Ro] |
относительно счетчика программы PC |
LDR Rd, [PC, #10bit_Offset] |
относительно указателя стека SP |
LDR Rd, [SP, #10bit_Offset] |
Адрес |
- |
с помощью PC |
ADD Rd, PC, #10bit_Offset |
с помощью SP |
ADD Rd, SP, #10bit_Offset |
Множественное чтение |
LDMIA Rb!, <reglist> |
Запись |
с константой смещения |
- |
слова |
STR Rd, [Rb, #7bit_offset] |
полуслова |
STRH Rd, [Rb, #6bit_offset] |
байта |
STRB Rd, [Rb, #5bit_offset] |
с регистром смещения |
- |
слова |
STR Rd, [Rb, Ro] |
полуслова |
STRH Rd, [Rb, Ro] |
байта |
STRB Rd, [Rb, Ro] |
относительно SP |
STR Rd, [SP, #10bit_offset] |
Множественная запись |
STMIA Rb!, <reglist> |
Помещение/ извлечение из стека |
Поместить регистры в стек |
PUSH <reglist> |
Поместить LR и регистры в стек |
PUSH <reglist, LR> |
Извлечь регистры из стека |
POP <reglist> |
Извлечь регистры и PC из стека |
POP <reglist, PC> |
Программное прерывание |
- |
SWI 8bit_Imm |
|