Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

са выше 0xE0000000. Отдельная область памяти 0x3FFF8000–0x3FFFFFFF предназначена для регистров управления портами в быстром режиме.

Организация памяти в ARM7 байтовая. Это значит, что каждый адрес указывает на ячейку размером 1 байт. В то же время хранимые в памяти данные выравниваются соответственно их разрядности. Поэтому при обращении к 16-разрядному слову адрес должен быть четным; для 32-разрядного слова адрес должен быть кратным четырем (закачиваться на шестнадцатеричные цифры 0, 4, 8, С). Обращение в байтовом режиме возможно к любому адресу.

Данные, занимающие более одного байта, хранятся с обратным порядком байт. Младший байт размещается по адресу с меньшим номером; старший байт — по адресу с большим номером.

1.3 Система команд

Cведения системе команд и методах адресации (раздел 1.4) необходимы программисту в ходе отладки, так как время от времени приходится прибегать к чтению дизассемблированной программы. Основы программирования на ассемблере рассмотрены в разделе 2.5. Там же читатель найдет пример простой программы.

Система команд ядра ARM7 включает всего 44 инструкции (не считая NOP). Отличительная особенность в том, что все инструкции являются условными. Каждая команда может быть выполнена или пропущена в зависимости от флагов состояния программы. Для этого в коде команды предусмотрено поле условия. На языке ассемблера условие обозначается двумя буквами непосредственно после мнемоники команды (сливается с командой в одно слово). Допустимые условия приведены в таблице 1.3.1.

Таблица 1.3.1 – Обозначения условных полей

Обознач.

Условие

Описание

EQ

 

Равенство. Флаг нуля установлен

NE

 

Неравенство. Флаг нуля сброшен

CS/HS

 

Больше или равно (без знака). Перенос

CC/LO

 

Меньше (без знака). Флаг переноса сброшен

MI

 

Отрицательный результат

PL

 

Положительный или нулевой результат

VS

 

Флаг переполнения установлен

 

Флаг переполнения сброшен

HI

 

Больше (без знака)

LS

 

Меньше или равно (без знака)

GE

 

Больше или равно (со знаком)

LT

 

Меньше (со знаком)

GT

 

Больше (со знаком)

LE

 

Меньше или равно (со знаком)

AL

 

Всегда (безусловное выполнение)

NV

 

Никогда

14

Перечень команд, сгруппированных по выполняемым функциям, приведен в таблице 1.3.2 (см. также о псевдокомандах в разделе 2.5). Кратко рассмотрим каждую из групп.

1.3.1 Команды арифметической и логической обработки

Команды этой группы предназначены для выполнения арифметических действий (сложение, вычитание) с целыми числами, а также логических операций (конъюнкция, дизъюнкция, исключающее «ИЛИ»). Команды являются трехадресными и все имеют общий синтаксис:

Операция{Усл}{S} , ,

При этом Операция, определяемая мнемоническим обозначением, выполняется над операндами и . Результат операции помещается в .

Здесь , любые регистры общего назначения (R0–R15). , занимающий 12 разрядов в коде команды, может быть адресован непосредственным или регистровым методом (раздел 1.4.1 и таблица 1.4.1).

Операнд может отсутствовать или совпадать с . Эти случаи интерпретируются одинаково — служит и первым операндом, и приемником.

Имеется необязательный модификатор «S», который указывает на необходимость обновления флагов состояния программы. Без этого модификатора обновление не происходит. Независимо от результата выполнения команды флаги результат остаются неизменными.

Примеры:

ADD

R0, R1,

R2

; R0

=

R1

+

R2

 

AND

R0, R1, #0x80

; R0

=

R1

&

0x80

 

ADD

R0,

R1

 

;

R0

+= R1

 

 

 

ADDEQ

R0,

R1, R2

;

if (Z) R0

= R1

+ R2

1.3.2 Команды умножения

Команды выполняют умножение 32-разрядных целых чисел. Операндами и приемником результата могут служат регистры общего назначения.

Имеются команды для умножения с накоплением. Результат может быть 32или 64-разрадным. Команды с 32-разрядным результатом отбрасывают старшую часть. 64-разрядный результат размещается в паре регистров общего назначения.

Примеры:

MUL

R0,

R1,

R2

;

R0

=

(long)(R1

*

R2)

MLA

R0,

R1,

R2, R3

;

R0

=

(long)(R1

*

R2 + R3)

Влияние команд на флаги состояния включается модификатором «S».

1.3.3 Команды регистровой пересылки

Команды пересылки предназначены для загрузки регистра короткой константой или для копирования содержимого одного регистра в другой. Команды двухадресные; второй операнд может быть задан непосредственно (константа) или адресован регистровым способом. При копировании возможна инверсия (команда MVN) или сдвиг.

15

Таблица 1.3.2 – Система команд процессорного ядра ARM7

Мнемоническое обозначение

 

Операция

Краткое описание

 

 

 

Команды арифметической обработки

ADD{Усл}{S}

, ,

 

 

Арифметическое сложение

ADC{Усл}{S}

, ,

 

 

Арифметическое сложение с переносом

SUB{Усл}{S}

, ,

 

 

Вычитание

SBC{Усл}{S}

, ,

 

 

Вычитание с учетом заема

RSB{Усл}{S}

, ,

 

 

Обратное вычитание

RSС{Усл}{S}

, ,

 

 

Обратное вычитание с учетом заема

 

 

 

Команды логической обработки

AND{Усл}{S}

, ,

 

 

Логическое умножение (И)

ORR{Усл}{S}

, ,

 

 

Логическое сложение (ИЛИ)

EOR{Усл}{S}

, ,

 

 

Исключающее ИЛИ (сложение по модулю 2)

BIC{Усл}{S}

, ,

 

 

Сброс битов в ноль

 

 

 

Команды регистровой пересылки

MOV{Усл}{S}

,

 

 

Копирование регистра или загрузка константы

MVN{Усл}{S}

,

 

 

Копирование регистра или загрузка константы

 

 

с инверсией

 

 

 

 

 

 

 

Команды сравнения и тестирования

CMN{Усл}

,

 

 

Сравнение с отрицательным числом

CMP{Усл}

,

 

 

Сравнение с положительным числом

TEQ{Усл}

,

 

 

Проверка равенства

TST{Усл}

,

 

 

Тестирование

 

 

Команды умножения c 32-разрядным результатом

MUL{Усл}{S}

, ,

 

 

Умножение (с учетом знаков)

MLA{Усл}{S}

, , ,

 

 

Умножение с накоплением (с учетом знаков)

16

Таблица 1.3.2 – Продолжение

Мнемоническое обозначение

 

Операция

 

Краткое описание

 

 

Команды умножения с 64-разрядным результатом

SMULL{Усл}{S} , , ,

 

 

 

Умножение учетом знака

SMLAL{Усл}{S} , , ,

 

 

 

Умножение с накопл. (с учетом знака)

UMULL{Усл}{S} , , ,

 

 

 

Умножение положительных чисел

UMLAL{Усл}{S} , , ,

 

 

 

Умножение полож. чисел с накоплением

 

 

 

Команды загрузки регистров из памяти

 

LDR{Усл}

,

 

 

 

Загрузка регистра

LDR{Усл}B

,

 

;

 

Загрузка регистра байтом

LDR{Усл}BT

,

 

;

 

Загрузка регистра байтом

 

 

c эмуляцией режима User

 

 

 

 

 

LDR{Усл}H

,

 

;

 

Загрузка регистра двухбайтным словом

LDR{Усл}SB

,

 

;

 

Загрузка регистра байтом

 

 

 

c дополнением знака

 

 

 

 

 

LDR{Усл}SH

,

 

 

 

Загрузка регистра двухбайтовым словом

 

 

 

c дополнением знака

 

 

 

 

 

LDR{Усл}T

,

 

 

 

Загрузка регистра

 

 

 

c эмуляцией режима User

 

 

 

 

 

 

 

 

Команды сохранения регистров в память

STR{Усл}

,

 

 

 

Сохранение регистра в память

STR{Усл}B

,

 

 

 

Сохранение в память мл. байта регистра

STR{Усл}BT

,

 

 

 

Сохранение в память младшего байта

 

 

 

регистра с эмуляцией режима User

 

 

 

 

 

STR{Усл}H

,

 

 

 

Сохранение в память мл. слова регистра

STR{Усл}T

,

 

 

 

Сохранение регистра в память с эмуля-

 

 

 

цией режима User

 

 

 

 

 

17

Таблица 1.3.2 – Продолжение

Мнемоническое обозначение

Операция

Краткое описание

 

 

 

Команды перестановки регистров и ячеек памяти

 

SWP{Усл}

, , [ ]

;

Обмен между регистрами и памятью

SWP{Усл}B

, , [ ]

 

Обмен байтов между регистрами и памятью

 

 

Команды пакетной пересылки

 

LDM{Усл}IA

{!},

Загрузить блок памяти

Методы адресации:

 

LDM{Усл}IB

{!},

 

с базовым адресом равным

IA (FD) — постинкрементный;

LDM{Усл}DA

{!},

в список Регистров

IB (ED) — преинкрементный;

LDM{Усл}DB

{!},

 

DA (FA) — постдекрементный;

STM{Усл}IA

{!},

 

Сохранить список Регистров

DB (EA) — предекрементный.

STM{Усл}IB

{!},

в блок памяти,

Список регистров задается в фигурных скобах через

STM{Усл}DA

{!},

начиная с адреса в

запятую или тире, например, {R0–R3, R5}

STM{Усл}DB

{!},

 

 

 

 

 

Команды передачи управления

 

B{Усл}

 

 

Передача управления по непосредственному адресу

BL{Усл}

 

;

Передача управления с сохранением адреса возврата

BX{Усл}

 

 

Передача управления по адресу в регистре

 

 

со сменой режима ARM/Thumb

 

 

 

SWI{Усл}

 

Вызов прерывания Software Interrupt; перевод процессора в режим ARM Supervisor

 

 

Команды обращения к слову состояния программы

 

MRS{Усл}{S}

, CPSR

 

Сохранение

или в регистр

MRS{Усл}{S}

, SPSR

 

 

 

 

MSR{Усл} CPSR_Поля, #

 

 

 

MSR{Усл} SPSR_Поля, #

Запись константы или регистра в разряды флагов в

или .

MSR{Усл} CPSR_Поля,

Поля задают копируемые байты: c — 0, x — 1, s — 2, f — 3

MSR{Усл} SPSR_Поля,

 

 

 

18