- •1 Общие сведения
- •1.1 Типы данных
- •1.2 Регистры общего назначения
- •1.3 Регистр состояния программы
- •1.4 Набор инструкций ARM
- •2 Флаги условий
- •3 Предикаты выполнения команды
- •4 Команды обработки данных
- •4.1 Условные обозначения
- •4.2 Форматы записи универсального операнда
- •4.3 Форматы записи команд обработки данных
- •4.4 Арифметические операции
- •4.5 Логические операции
- •4.6 Операции простой пересылки
- •4.7 Операции сравнения и проверки
- •4.8 Сдвиговые операции при формировании второго операнда
- •4.8.1 Арифметический сдвиг вправо
- •4.8.2 Логические сдвиги
- •4.8.3 Циклический сдвиг вправо
- •4.8.4 Циклический сдвиг вправо на одну позицию с переносом
- •4.9 Примеры
- •5 Команды передачи управления
- •5.1 Условные обозначения
- •5.2 Форматы записи команд передачи управления
- •5.3 Переход на метку
- •5.4 Переход по адресу в регистре
- •5.5 Вызов подпрограммы
- •5.6 Вызов подпрограммы по адресу в регистре
- •5.7 Вызов подпрограммы со сменой набора инструкций
- •6 Команды доступа к памяти (пересылки данных)
- •6.1 Условные обозначения
- •6.2 Форматы записи выражения, формирующего адрес, и виды адресации
- •6.3 Режимы пересылки
- •6.4 Особенности использования различных команд пересылки
- •6.5 Примеры использования команд пересылки
- •7 Команды умножения
- •7.1 Условные обозначения
- •7.2 Простое умножение
- •7.3 «Длинное» умножение
- •8 Псевдоинструкции
- •8.1 Псевдоинструкция ldr
таблице 10.
Таблица 10: Сводная таблица форматов команд пересылки
|
Загрузка |
Сохранение |
Беззнаковое |
ldr{cond} Rd, [Rn], Offset |
str{cond} Rd, [Rn], Offset |
слово |
ldr{cond} Rd, [Rn, Offset]{!} |
str{cond} Rd, [Rn, Offset]{!} |
|
ldr{cond} Rd, [Rn] |
str{cond} Rd, [Rn] |
|
ldr{cond} Rd, label |
str{cond} Rd, label |
Знаковое |
ldr{cond}sh Rd, [Rn], Offset |
(См. сохранение беззнакового |
полуслово |
ldr{cond}sh Rd, [Rn, Offset]{!} |
полуслова) |
|
ldr{cond}sh Rd, [Rn] |
|
|
ldr{cond}sh Rd, label |
|
Беззнаковое |
ldr{cond}h Rd, [Rn], Offset |
str{cond}h Rd, [Rn], Offset |
полуслово |
ldr{cond}h Rd, [Rn, Offset]{!} |
str{cond}h Rd, [Rn, Offset]{!} |
|
ldr{cond}h Rd, [Rn] |
str{cond}h Rd, [Rn] |
|
ldr{cond}h Rd, label |
str{cond}h Rd, label |
Знаковый |
ldr{cond}sb Rd, [Rn], Offset |
(См. сохранение беззнакового байта) |
байт |
ldr{cond}sb Rd, [Rn, Offset]{!} |
|
|
ldr{cond}sb Rd, [Rn] |
|
|
ldr{cond}sb Rd, label |
|
Беззнаковый |
ldr{cond}b Rd, [Rn], Offset |
str{cond}b Rd, [Rn], Offset |
байт |
ldr{cond}b Rd, [Rn, Offset]{!} |
str{cond}b Rd, [Rn, Offset]{!} |
|
ldr{cond}b Rd, [Rn] |
str{cond}b Rd, [Rn] |
|
ldr{cond}b Rd, label |
str{cond}b Rd, label |
6.4Особенности использования различных команд пересылки
Взависимости от используемой инструкции существуют ограничения на величину смещения в тех командах, где оно размещается непосредственно в теле инструкции. К таким инструкциям относятся загрузка и сохранение с использованием относительной адресации (смещение вычисляется автоматически на основе указанной метки label; см. рис. 2), а также предындексной или постиндексной адресации с непосредственно заданным смещением (выражение #expr на рис. 2). Диапазоны допустимых значений смещений приведены в таблице 11.
Другое ограничение связано с невозможностью применения сдвиговой операции к базовому регистру, содержащему смещение, в командах пересылки знаковых и беззнаковых полуслов и знаковых байтов (см. рис. 2).
Все указанные ограничения проверяются автоматически на этапе компиляции.
23
Таблица 11: Ограничения на величину смещения в некоторых командах пересылки
|
|
Ограничения |
|
|
|
Вид команды |
|
label |
#expr |
|
|
|
|
|
|
|
|
Пересылка слов |
или |
Метка label должна находится в диапазоне |
Expr должно |
быть |
в |
беззнаковых байтов |
[-4095; +4095] от значения программного |
диапазоне |
|
|
|
|
|
счётчика при выполнении инструкции. |
[-4095; +4095] |
|
|
Пересылка |
|
Метка label должна находится в диапазоне |
Expr должно |
быть |
в |
знаковых/беззнаковых |
[-255; +255] от значения программного |
диапазоне |
|
|
|
полуслов |
или |
счётчика при выполнении инструкции. |
[-255; +255] |
|
|
знаковых байтов |
|
|
|
|
|
6.5Примеры использования команд пересылки
Листинг 5. Пример использования команд пересылки для модификации данных в памяти
ldr |
r2, =var |
@ Загрузить |
в r2 |
адрес, соответствующий метке var; |
|||||
ldr |
r1, [r2] |
@ Загрузить |
в |
r1 |
значение |
числа, расположенного в памяти по |
|||
add |
r1, |
r4 |
@ адресу, лежащему в r2 |
значение r4; результат записать в r1 |
|||||
@ |
Прибавить |
к |
значению |
r1 |
|||||
str |
r1, |
[r2] |
@ |
Сохранить |
r1 обратно |
по |
тому же адресу |
Листинг 6. Пример использования команд пересылки с различными видами адресации
array: |
16 |
|
.word |
|
|
.word |
32 |
|
.word |
64 |
|
.word |
128 |
|
test: |
r1, =array; |
@ Загрузка адреса array в r1(псевдоинструкция) |
ldr |
||
ldr |
r2, [r1], #4 |
@ Постиндексная адресация; r2=16 |
ldr |
r3, [r1, #4] |
@ Предындексная адресация (не автоинкр.); r3=64 |
ldr |
r4, [r1, #8]! |
@ Предындексная автоинкрементная; r4=128 |
ldr |
r5, [r1, #-12]! |
@ Предындексная автоинкрементная; r5=16 |
ldr |
r6, array+8; |
@ Относительная адресация; r6=64 |
ldr |
r7, array+4; |
@ Относительная; r7=32 |
ldr |
r8, [r1]; |
@ Косвенная; r8=16 |
Листинг 7. Пример использования команд пересылки при работе со знаковыми числами
.section .text.program data_consts:
.hword -32000
.hword -768;
.align
test:
ldrsh |
r1, |
data_consts |
+ 2 |
@ |
Загрузить |
знаковое |
слово |
(-32000) |
ldrsh |
r2, |
data_consts |
@ |
Загрузить |
знаковое |
слово |
(-768) |
24