Составить таблицу основных команд процессоров типа arm

Обновлено: 06.07.2024

В первой части главы 3 рассматривалась архитектура ARM в качестве примера системы команд типа RISC. Процессоры ARM предназначены главным образом для встроенных систем. Поэтому они должны иметь невысокую цену и потреблять мало энергии. Многие устройства, например мобильные телефоны, питаются от батарей с напряжением от 1 до 3 В. По сравнению с высокопроизводительны­ми процессорами Intel Pentium, рассчитанными на рынок персональных компью­теров, процессоры ARM имеют более простую структуру и содержат гораздо меньше транзисторов. Далее мы поговорим о различных реализациях системы команд ARM и обсудим ряд важных вопросов.

С момента появления архитектуры ARM (середина 1980-х годов) и до 2000 года было разработано пять версий системы команд ARM — от vl до v5. В главе 3 вы по­знакомились с версией v3 и реализующим ее процессором ARM7, созданным в се­редине 1990-х годов. Материал о различных моделях этого процессора и их важ­нейших характеристиках предлагается вашему вниманию в следующих разделах.

Версии vl и v2 поддерживают только 26-разрядную адресацию памяти, вер­сия v2 включает и 32-разрядные команды умножения. В версии v3 введена пол­ная 32-разрядная адресация для операндов длиной 1 байт и 32-разрядные слова, в версии v4 добавлены полные 64-разрядные команды умножения и команды загрузки и умножения для 16-разрядных операндов-данных. В версии v5 и ее рас­ширении v5E появились специализированные команды:

? управления точками останова в программах с целью их отладки;

? нормализации чисел для программной реализации арифметических опе­раций с плавающей запятой;

? выполнения операций сложения и умножения над 16-разрядными опе­рандами для программ цифровой обработки сигналов.

На протяжении всего процесса эволюции архитектуры ARM команды всех ее пяти версий кодировались в 32-разрядном формате. Наряду с версиями v4 и v5 существовали их эквиваленты с более компактной кодировкой команд, о которых речь пойдет в следующих разделах.

11.1.1. Система команд Thumb

Помимо полных наборов команд v4 и v5 с 32-разрядной кодировкой специфика­ция архитектуры системы команд ARM предлагает компактную кодировку под­множества этих наборов. Данное подмножество называется Thumb, а соответст­вующие версии архитектуры ARM носят имена v4T и v5T. Все команды Thumb кодируются 16-разрядным полусловом.

Разработка подсистемы команд Thumb обусловлена необходимостью сокра­тить объем памяти, отводимый для хранения программ, которые управляют недо­рогими встроенными системами с низким энергопотреблением. На базе архитек­туры v4T создан процессор ARM7TDMI. Этот процессор, реализованный в виде единственной микросхемы с небольшим объемом памяти и программным обеспе­чением для цифровой обработки сигналов, предназначен для использования в мобильных телефонах.

Программы, состоящие из команд Thumb, выполняются следующим образом. Команды извлекаются из памяти и динамически (непосредственно перед выпол­нением) переводятся из 16-разрядного формата в соответствующий стандартный 32-разрядный формат команд ARM, после чего выполняются. Так они обрабаты­ваются в большинстве недорогих процессоров. В некоторых высокопроизводи­тельных процессорах команды Thumb не преобразуются в 32-разрядный формат, а декодируются из 16-разрядного формата. В регистре текущего состояния про­граммы CPSR (Current Program Status Register) существует разряд Т, определяю­щий, какой формат, Thumb (Т = 1) или стандартный 32-разрядный ARM (Т = 0), имеет входной поток команд. Допускается чередование в одном приложении ко­манд Thumb и стандартных команд.

Между командами Thumb и стандартными командами ARM есть два сущест­венных различия. Во-первых, во многих командах Thumb используется формат с двумя операндами, где регистр назначения является одним из исходных регист­ров. Во-вторых, все стандартные инструкции ARM поддерживают механизм ус­ловного выполнения команд (по предположению), тогда как в подсистеме Thumb это справедливо только для команд перехода и ряда других команд. Вот почему команды Thumb можно представлять в виде 16-разрядных слов.

11.1.2. Ядра процессоров

Компания ARM разрабатывает и лицензирует спецификации процессоров ARM и тесно связанных с ними компонентов, таких как кэш-память и блоки управле­ния памятью. Эти спецификации приобретаются компаниями-производителями встраиваемых систем и других специализированных компьютерных компонен­тов. Как правило, схемы процессора ARM интегрируются на одной микросхеме со специализированным аппаратным обеспечением, предназначенным для кон­кретного типа устройств. Поэтому схемы ARM называют ядром. Спецификации компании ARM делятся на две категории: спецификации аппаратного макроэле­мента и синтезируемые спецификации. Первая категория охватывает подробные спецификации физической организации схемы, ориентированные на процесс про­изводства конкретной микросхемы. Ко второй категории относятся программные модули на языке высокого уровня, которые синтезируются из библиотечных ком­понентов в соответствии с желаемой технологией. Такая спецификация допускает настройку множества разнообразных параметров, определяющих функциональ­ные элементы процессора. Ядро ARM7TDMI процессора разработано в форме спецификации аппаратного макроэлемента, а ядро ARM7TDMI-7 — в форме син­тезируемой спецификации.

Компания ARM разработала ядра двух типов: обычные процессорные и CPU. Процессорное ядро содержит только процессор и связанные с ним соединения адресной шины и шины данных. Ядро CPU кроме процессора включает также кэш и блок управления памятью. Название CPU не совсем точное, поскольку обычно оно означает центральное процессорное устройство (ЦПУ). Однако мы употребляем его, так как это термин, посредством которого компания ARM иден­тифицирует класс своих устройств. Далее приведены краткие описания некото­рых типичных процессорных ядер и ядер CPU.

Процессорное ядро ARM7TDMI

Это ядро обычно используется в недорогих устройствах с низким потреблением энергии. Процессор ARM7TDMI включает простой 3-ступенчатый конвейер, со­стоящий из нескольких ступеней: выборки, декодирования и выполнения. В нем реализована версия v4T архитектуры ARM, поддерживающая как стандартный набор команд, так и команды Thumb. Типичными рабочими параметрами явля­ются напряжение питания 3,3 В и тактовая частота 66 МГц. Возможны и другие варианты реализации, например с напряжением питания 0,9 В для устройств с низковольтными батареями или с тактовой частотой 100 МГц для устройств с бо­лее высокой производительностью.

Процессорные ядра ARM9TDMI и ARM10TDMI

Процессорные ядра ARM9TDMI и ARM10TDMI основаны на 5-ступенчатом и 6-ступенчатом конвейерах соответственно. Для достижения более высокой про­изводительности, чем у процессора ARM7TDMI, в них предусмотрены раздель­ные порты команд и данных. На тактовых частотах 200 и 300 МГц уровни произ­водительности версий 7, 9 и 10 данного подсемейства процессоров ARM соотно­сятся как 1:2:4. Шина каждого порта памяти процессора ARM10TDMI шире, чем у двух других процессоров, и равна 64 битам, в то время как у процессоров ARM9TDMI и ARM7TDMI данный параметр составляет только 32 бита. В про­цессоре ARM9TDMI реализована версия v4T системы команд ARM, а в процес­соре ARM10TDMI — версия v5TE. Оба процессора непосредственно декодируют команды Thumb для выполнения. Более высокая производительность может быть достигнута в случае использования с этими процессорами кэш-памяти.

Эти CPU-ядра, основанные на процессорных ядрах ARM9TDMI и ARM10TDMI, снабжены раздельными кэшами команд и данных. Любой кэш ядра ARM920T имеет объем 16 Кбайт и 64-канальную множественно-ассоциативную структуру, а также состоит из 32-байтовых блоков. Для каждого порта памяти выделен от­дельный блок управления памятью. Кроме того, все они содержат 64-элементный ассоциативный буфер TLB. В ядре ARM1020E есть два кэша, объемом 32 Кбайт, имеющих такую же структуру, как и кэш ядра ARM9TDMI.

CPU-ядро StrongARM — это совместная разработка компаний ARM и Digital Equipment Corporation (последняя в настоящее время входит в состав компании Compaq). Его версия SA-110 производится корпорацией Intel. В этом процессор­ном компоненте реализована версия v4 архитектуры ARM. Данный процессор не поддерживает набор команд Thumb, но в остальном совместим с процессорным ядром ARM9TDMI. По производительности ядро StrongARM SA-110 близко к ядру ARM920T, но в отличие от последнего оно реализовано по более старой тех­нологии, потребляет больше энергии и работает на тактовой частоте 200 МГц. Процессор StrongARM содержит 5-ступенчатый конвейер. В нем предусмот­рены отдельные кэши команд и данных. Оба кэша имеют 32-канальную множест­венно-ассоциативную структуру и состоят из 32-байтовых блоков. Для повыше­ния производительности устройств цифровой обработки сигналов процессор снабжен высокоскоростной схемой умножителя с задержкой в три и менее такта.


Процессоры архитектуры ARM способны работать в двух различных режимах (находиться в двух разных состояниях – ARM State и THUMB State), которым соответствуют два различных набора команд. Первый носит название «система команд ARM» и является основным в том смысле, что отображает весь набор операций, который способен выполнять процессор. Команды набора ARM имеют длину 4 байта (32 бита). Второй набор команд, называемый THUMB, реализует некоторое подмножество операций и способов адресации системы команд ARM. Команды набора THUMB имеют длину 2 байта (16 битов). Фактически набор команд THUMB есть не что иное, как другой способ кодирования тех же операций, что и операции набора , реализованный в сокращенной разрядной сетке.

Более короткая длина команды набора THUMB ограничивает:
‑ перечень операций, которые удается закодировать,
‑ набор способов адресации, которые можно использовать в командах, а также
‑ диапазон непосредственных констант и адресных смещений (displacement), которые можно использовать в командах с непосредственной адресацией, а также в адресации «со смещением».

Каждой команде набора THUMB соответствует команда набора ARM. Фактически, в режиме THUMB процессор выполняет внутреннее «перекодирование», т.е. формирует и выполняет эквивалентную команду набора ARM. Обратное несправедливо, т.е. для выполнения действия, соответствующего одной команде набора ARM нередко (в среднем в . % случаев) придется использовать более, чем одну команду набора THUMB.

Благодаря более короткой длине команд набора THUMB, объем кода (в байтах) для того же алгоритма получается на 35% меньше ([2], стр. 1-2), чем при использовании команд ARM, ценой увеличения количества команд соответственно на приблизительно 50% (в полтора раза). В системе с 32-разрядной шиной памяти это означает увеличение времени выполнения этого кода также в полтора раза. Однако в компактных системах с 16-разрядной шиной памяти (что характерно для встраиваемых систем) положение иное. При 16-разрядной шине в режиме ARM для выборки каждой команды требуется два цикла шины. Поскольку большая часть команд RISC-архитектуры не требует обращений к памяти за операндами (расположенными в регистрах - . ссылку на описание RISC-архитектуры), чтение программного кода из памяти занимает существенную долю времени, и в системах с 16-разрядной шиной использование режима THUMB вместо может дать до 160% повышение производительности одновременно с вышеупомянутым уменьшением объема кода ([2], стр. 1-2).

Однако не следует думать, что набор команд THUMB всегда эффективнее, нежели набор ARM. В ряде ситуаций, оказывается наоборот (. подробнее расписать, когда или ссылку).

Переход процессора из одного состояния в другое выполняется использованием специальной разновидности команды перехода (см. . ).

Набор команд состояния ARM

Некоторые замечания об особенностях команд системы ARM

· На структуру системы команд процессоров ARM оказала значительное влияние идеология RISC. Это выражается в нескольких аспектах.

Отсутствуют команды, реализующие «сложные» (требующие для выполнения много тактов) команды, например, деление. Подобные операции реализуются в процессорах ARM несколькими командами (подпрограммой либо макроподстановкой).

Ограниченная длина команды накладывает ограничения на длину (разрядность) таких компонент команды, как непосредственный операнд или смещение в адресации косвенно-регистровой со смещением.

· В соответствии с принципами RISC-идеологии, двухместные операции, выполняемые командами обработки (сложение, вычитание, побитовые операции и т.п.), да и одноместные тоже (смена знака) работают только с операндами, находящимися в регистрах общего назначения РОН. Для обращения к памяти реализованы только команды, выполняющие операцию копирования содержимого участка памяти в регистр, либо обратно, содержимого регистра в память. Однако, одновременно с копированием в этих командах могут выполняться и некоторые действия, такие. как расширение знака (т.е. преобразование короткого операнда к длинной разрядной сетке).

· Почти все команды набора ARM ‑ это команды с условным исполнением. Это означает, что для каждой такой команды программист может указать условие исполнения (комбинацию флагов в регистре состояний). Набор условий исполнения такой же, как для команд условных ветвлений. Для задания условия в команде предусмотрено 4-битовое поле, задающее одно из 14 условий.. Если заданное условие выполнено, выполняется операция, предусмотренная командой. Если условие не выполнено, на этапе исполнения ничего не делается (команда ведет себя как NOP). Одна из битовых комбинаций в поле условия (15-я) обозначает безусловное исполнение (always) и еще одна является зарезервированной (не используется). Таким образом, поскольку команды перехода и вызова подпрограммы также являются командами с условным исполнением, в наборе ARM отсутствуют отдельные команды условных ветвлений.

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

Привет всем!
По роду деятельности я программист на Java. Последние месяцы работы заставили меня познакомиться с разработкой под Android NDK и соответственно написание нативных приложений на С. Тут я столкнулся с проблемой оптимизации Linux библиотек. Многие оказались абсолютно не оптимизированы под ARM и сильно нагружали процессор. Ранее я практически не программировал на ассемблере, поэтому сначала было сложно начать изучать этот язык, но все же я решил попробовать. Эта статья написана, так сказать, от новичка для новичков. Я постараюсь описать те основы, которые уже изучил, надеюсь кого-то это заинтересует. Кроме того, буду рад конструктивной критике со стороны профессионалов.

Введение
Итак, для начала разберёмся что же такое ARM. Википедия дает такое определение:

Архитектура ARM (Advanced RISC Machine, Acorn RISC Machine, усовершенствованная RISC-машина) - семейство лицензируемых 32-битных и 64-битных микропроцессорных ядер разработки компании ARM Limited. Компания занимается исключительно разработкой ядер и инструментов для них (компиляторы, средства отладки и т. п.), зарабатывая на лицензировании архитектуры сторонним производителям.

Если кто не знает, сейчас большая часть мобильных устройств, планшетов разработаны именно на этой архитектуре процессоров. Основным преимуществом данного семейства является низкое энергопотребление, благодаря чему он часто используется в различных встроенных системах. Архитектура развивалась с течением времени, и начиная с ARMv7 были определены 3 профиля: ‘A’(application) - приложения, ‘R’(real time) - в реальном времени,’M’(microcontroller) - микроконтроллер. Историю разработки этой технологии и другие интересный данные вы можете прочитать в Википедии или погуглив в интернете. ARM поддерживает разные режимы работы (Thumb и ARM, кроме того в последние время появился Thumb-2, являющийся смесью ARM и Thumb). В данной статье рассмотрим собственно режим ARM, в котором исполняется 32-битный набор команд.

Каждый ARM процессор создан из следующих блоков:

  • 37 регистров (из которых видимых при разработке только 17)
  • Арифметико-логи́ческое устройство (АЛУ) - выполняет арифметические и логические задачи
  • Barrel shifter - устройство, созданное для перемещения блоков данных на определенное количество бит
  • The CP15 - специальная система, контроллирующая ARM сопроцессоры
  • Декодер инструкций - занимается преобразованием инструкции в последовательность микроопераций
Конвейерное исполнение (Pipeline execution)
В ARM процессорах используется 3-стадийный конвейер (начиная с ARM8 был реализова 5-стадийный конвейер). Рассмотрим простой конвейер на примере процессора ARM7TDMI. Исполнение каждой инструкции состоит из трёх ступеней:

1. Этап выборки (F)
На этом этапе инструкции поступают из ОЗУ в конвейер процессора.
2. Этап декодирования (D)
Инструкции декодируются и распознаётся их тип.
3. Этап исполнения (E)
Данные поступают в ALU и исполняются и полученное значение записывается в заданный регистр.

Но при разработке надо учитывать, что, есть инструкции, которые используют несколько циклов исполнения, например, load(LDR) или store. В таком случае этап исполнения (E) разделяется на этапы (E1, E2, E3. ).

Условное выполнение
Одна из важнейших функций ARM ассемблера - условное выполнение. Каждая инструкция может исполняться условно и для этого используются суффиксы. Если суффикс добавляется к названию инструкции, то прежде чем выполнить ее, происходит проверка параметров. Если параметры не соответствуют условию, то инструкция не выполняется. Суффиксы:
MI - отрицательное число
PL - положительное или ноль
AL - выполнять инструкцию всегда
Суффиксов условного выполнения намного больше. Остальные суффиксы и примеры прочитать в официальной документации: ARM документация
А теперь пришло время рассмотреть…
Основы синтаксиса ARM ассемблера
Тем, кто раньше работал с ассемблером этот пункт можно фактически пропустить. Для всех остальных опишу основы работы с этим языком. Итак, каждая программа на ассемблере состоит из инструкций. Инструкция создаётся таким образом:
<инструкция|операнды>
Метка - необязательный параметр. Инструкция - непосредственно мнемоника инструкции процессору. Основные инструкции и их использование будет разобрано далее. Операнды - константы, адреса регистров, адреса в оперативной памяти. Комментарий - необязательный параметр, который не влияет на исполнение программы.
Имена регистров

3.v1-v8 (переменные регистры, с r4 по r11)

4.sb and SB (статический регистр, r9)

10.pc and PC (программный счетчик, r15).

Переменные и костанты
  • Числовые
  • Логические
  • Строковые
Примеры инструкций ARM ассемблера
В данной таблице я собрал основные инструкции, которая потребуется для дальнейшей разработки (на самом базовом этапе:):

Чтобы закрепить использование основных инструкций давайте напишем несколько простых примеров, но сначала нам понадобится arm toolchain. Я работаю в Linux поэтому выбрал: frank.harvard.edu/

QEMU - свободная программа с открытым исходным кодом для эмуляции аппаратного обеспечения различных платформ.

Включает в себя эмуляцию процессоров Intel x86 и устройств ввода-вывода. Может эмулировать 80386, 80486, Pentium, Pentium Pro, AMD64 и другие x86-совместимые процессоры; PowerPC, ARM, MIPS, SPARC, SPARC64, m68k - лишь частично.

Работает на Syllable, FreeBSD, FreeDOS, Linux, Windows 9x, Windows 2000, Mac OS X, QNX, Android и др.

Итак, для эмуляции arm понадобится qemu-system-arm. Этот пакет есть в yum, так что тем, у кого Fedora, можно не заморачиваться и просто выполнить комманду:
yum install qemu-system-arm

Далее надо запустить эмулятор ARM, так, чтобы он выполнил нашу программу arm.bin. Для этого создадим файл flash.bin, который будет флэш памятью для QEMU. Сделать это очень просто:
dd if=/dev/zero of=flash.bin bs=4096 count=4096 dd if=arm.bin of=flash.bin bs=4096 conv=notrunc
Теперь грузим QEMU с полученой flash памятью:
qemu-system-arm -M connex -pflash flash.bin -nographic -serial /dev/null
На выходе вы получите что-то вроде этого:

$ qemu-system-arm -M connex -pflash flash.bin -nographic -serial /dev/null
QEMU 0.15.1 monitor - type "help" for more information
(qemu)

Наша программа arm.bin должна была изменить значения четырех регистров, следовательно для проверки правильности работы давайте посмотрим на эти самые регистры. Делается это очень простой коммандой: info registers
На выходе вы увидите все 15 ARM регистров, при чем у четырех из них будут измененные значения. Проверьте:) Значения регистров совпадают с теми, которые можно ожидать после исполнения программы:
(qemu) info registers R00=00000003 R01=00000002 R02=00000005 R03=00000006 R04=00000000 R05=00000000 R06=00000000 R07=00000000 R08=00000000 R09=00000000 R10=00000000 R11=00000000 R12=00000000 R13=00000000 R14=00000000 R15=00000010 PSR=400001d3 -Z-- A svc32

P.S. В этой статье я постарался описать основы программирования на ARM ассемблер. Надеюсь вам понравилось! Этого хватит для того, чтобы далее углубляться в дебри этого языка и писать на нем программы. Если все получится, буду писать дальше о том, что узнаю сам. Если есть ошибки, прошу не пинать, так как я новичок в ассемблере.

    EQ EQual / Равно

    NE Not Equal / Не равно

    VS oVerflow Set / Установка переполнения

    VC oVerflow Clear / Очищение переполнения

    HI HIgher / Выше

    LS Lower or the Same / Ниже или то же самое

    PL PLus / Плюс

    MI MInus / Минус

    CS Carry Set / Установка переноса

    CC Carry Clear / Очищение переноса

    GE Greater than or Equal / Больше или равно

    GT Greater Than / Больше

    LE Less than or Equal / Меньше или равно

    LT Less Than / Меньше

    Z is Zero / Ноль

    NZ is not Zero / Не ноль

    CMP r0, r4 ; Комментарии в ассемблере идут после точки с запятой (;)

    BEQ label34 ; B - инструкция перехода, а EQ - суффикс, означающий

    ; "Если Равно"

    SUBS r0,r1,0x0FF ; Устанавливает флаги согласно результату выполнения

    ; инструкции

    ldrZ r0,=0x0FFFF ; Загрузит в регистр r0 0x0FFFF только, если состояние

    флагов равно Нулю.

Поначалу ARM довольно непривычный ассемблер (если переучиваться с x86 , MCS51 или AVR ). Но у него довольно простая и логичная организация, поэтому усваивается быстро.

Последняя ссылка мне очень помогла, развеяла туман =). Второе, что хорошо может помочь - это, как ни странно, C-компилятор IAR Embedded Workbench for ARM (далее просто IAR EW ARM ). Дело в том, что он со стародавних времен умеет (как и все уважающие себя компиляторы, впрочем) компилировать C-код в код ассемблера, который, в свою очередь, так же легко компилируется ассемблером IAR в объектный код. Поэтому нет ничего лучше написать простейшую функцию на C, скомпилировать её в ассемблер, и сразу станет понятно, какая команда ассемблера что делает, как передаются аргументы и как возвращается результат. Убиваете сразу двух зайцев - обучаетесь ассемблеру и заодно получаете информацию, как интергрировать ассемблерный код в проект на C. Я тренировался на функции подсчета CRC16, и в результате получил её полноценную версию на ассемблере.

Подробно ознакомиться с системой команд в режиме ARM можно .

Режимы адресации - процедуры, которые используются различными инструкциями для генерации значений, используемых инструкциями. Процессор ARM7TDMI поддерживает 5 режимов адресации:

  • Режим 1 - Сдвиговые операнды для инструкций обработки данных.
  • Режим 2 - Чтение и запись слова или беззнакового байта.
  • Режим 3 - Чтение и запись полуслова или загрузка знакового байта.
  • Режим 4 - Множественные чтение и запись.
  • Режим 5 - Чтение и запись сопроцессора.

Режимы адресации с указанием их типов и мнемонических кодов представлены в таблице 1.3.

Таблица 1.3. Режимы адресации

Операнд является частью инструкции, которая ссылается на данные или периферийное устройство. Операнды 2 представлены в таблице 1.4.

Таблица 1.4. Операнд 2

Поля представлены в таблице 1.5.

Таблица 1.5. Поля

Поля условий представлены в таблице 1.6.

Таблица 1.6. Поля условий

Тип поля Суффикс Описание Условие
Условие 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 Меньше NV (N=1 и V=0) или (N=0 и V=1)
GT Больше Z=0, N=V (N=V=1 или N=V=0)
LE Меньше или равно Z=0 или NV (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

В настоящее время для программирования даже достаточно простых микроконтроллеров используются языки высокого уровня, как правило, являющиеся подмножествами языка С или С++.

Однако при изучении архитектуры процессоров и ее особенностей целесообразно использовать языки Ассемблера, так как только такой подход может обеспечить выявление особенностей изучаемой архитектуры. По этой причине дальнейшее изложение ведется с использованием языка Ассемблера.

Прежде чем приступить к рассмотрению команд ARM7, необходимо отметить следующие ее особенности:

Поддержку двух наборов команд: ARM с 32-битными командами и THUMB с 16-битными командами. Далее рассматривается 32-битный набор команд, слово ARM будет означать команды, принадлежащие к этому формату, а слово ARM7 - собственно ЦПУ.

Поддержку двух форматов 32-х разрядного адреса: с обратным порядком бит (big-endian processor и с прямым порядком бит (little-endian processor)). В первом случае старший бит (Most Significant Bit - MSB) располагается в младшем бите слова, а во втором случае - в старшем. Это обеспечивает совместимость с другими семействами 32-х разрядных процессоров при использовании языков высокого уровня. Однако в ряде семейств процессоров с ядром ARMиспользуется только прямой порядок байтов (т.е. MSB является самым старшим битом адреса), что значительно облегчает работу с процессором. Поскольку компилятор, используемый для ARМ7, работает с код в обоих форматах, необходимо удостовериться, что формат слов задан правильно, в противном случае полученный код будет «вывернут наизнанку».

Возможность выполнения различных типов сдвига одного из операндов «на проходе» перед использованием в АЛУ

Поддержка условного выполнения любой команды

Возможность запрета изменения флагов результатов выполнения операции.

Условное выполнение команд

Одна из важных особенностей набора команд ARM заключается в том, что поддерживается условное выполнение любой команды. В традиционных микроконтроллерах единственными условными командами являются команды условных переходов, и, быть может, ряд других, таких как команды проверки либо изменения состояния отдельных битов. В наборе команд ARM старшие 4 бита кода команды всегда сравниваются с флагами условий в регистре CPSR. Если их значения не совпадают, команда на стадии дешифрации заменяется команда NOP (нет операции).

Это существенно сокращает время выполнения участков программы с «короткими» переходами. Так, например, при решении квадратных уравнений с вещественными коэффициентами и произвольными корнями при отрицательном дискриминанте необходимо перед вычислением квадратного корня сменить знак дискриминанта, а результат присвоить мнимой части ответа.

При традиционном решении этой задачи необходимо ввести команду условного перехода. Выполнение этой команды занимает как минимум 2 такта – дешифрация и загрузка нового значения адреса в счетчик команд и дополнительное число тактов на загрузку конвейера команд. При использовании условного выполнения команды при положительном дискриминанте команда смены знака заменяется пустой операцией. При этом не происходит очистка конвейера команд, и потери составляют не более одного такта. Порог, при котором замена условных команд командой NOP оказывается эффективнее выполнения традиционных команд условного перехода и связанного с этим повторным заполнением конвейера равен его глубине, т.е. трем.

Для реализации этой возможности к базовым мнемоническим обозначениям команд ассемблера (и С то же), нужно добавить любой из шестнадцати префиксов, определяющих тестируемые состояния флагов условий. Эти префиксы приведены в табл. 3. Соответственно существует 16 вариантов каждой команды. Например, следующая команда:

означает, что загрузка числа 0x00800000 в регистр R1 будет произведена только том случае, если результат выполнения последней команды обработки данных был «равно» или получен 0 результат и соответственно установлен флаг (Z) регистра CPSR.

Базовую систему команд микропроцессора можно условно разделить на несколько групп по функциональному назначению:

Кроме базовой системы команд микропроцессора существуют также команды расширений:

  • X87 – расширение, содержащее команды математического сопроцессора (работа с вещественными числами)
  • MMX – расширение, содержащее команды для кодирования/декодирования потоковых аудио/видео данных;
  • SSE – расширение включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных;
  • SSE2 – модификация SSE, содержит инструкции для потоковой обработки целочисленных данных, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX, появившегося гораздо раньше;
  • SSE3, SSE4 – содержат дополнительные инструкции расширения SSE.

В таблице команд приняты следующие обозначения:
r – регистр
m – ячейка памяти
c – константа
8, 16, 32 – размер в битах
На все базовые команды процессора накладываются следующие ограничения:

  • Нельзя в одной команде оперировать двумя областями памяти одновременно. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
  • Нельзя оперировать сегментным регистром и значением непосредственно из памяти. Поэтому для выполнения такой операции нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек.
  • Нельзя оперировать двумя сегментными регистрами. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных регистры общего назначения. Например,

Команды передачи данных

Основной командой передачи данных является команда MOV , осуществляющая операцию присваивания:

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

Команды установки единичного бита

Проверяют условие состояния битов регистра EFLAGS и, если условие выполняется, то младший бит операнда устанавливается в 1, в противном случае в 0. Анализ битов производится аналогич­но условным перехо­дам.

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

Особого внимания среди рассмотренных команд целочисленной арифметики заслуживает команда CMP , которая вычитает второй операнд из первого и не сохраняет результат, а устанавливает биты OF, SF, ZF, AF, PF, CF регистра признаков EFLAGS в соответствии с результатом. Команда CMP чаще всего предшествует командам знакового или беззнакового условных переходов.

Логические команды

Выполнение логических операций описано здесь

Сдвиговые команды

Выполнение сдвиговых операций в языке Си рассмотрено здесь .

Команды циклического сдвига

Команды циклического сдвига выполняются в соответствии со схемой

Команды коррекции двично-десятичных чисел

Команды коррекции двоично-десятичных чисел не имеют операндов и используют операнд по умолчанию, хранящийся в регистре AX (паре регистров AH:AL ).

Команды преобразования типов

Команды преобразования типов предназначены для корректного изменения размера операнда, заданного неявно в регистре-аккумуляторе ( EAX , AX , AL ). Непосредственно после аббревиатуры команды операнд не указывается.

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

Команды управления флагами предназначены для сброса или установки соответствующего бита регистра признаков EFLAGS . Команды управления флагами не имеют операндов.

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

Команды обращения к процедуре (функции)

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

Читайте также: