|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Краткая документация по командам ассемблера ARM для процесора Cortex M4
Время создания: 02.04.2024 10:31
Текстовые метки: arm, документация, синтаксис, ассемблер, инструкции, список, перечень, процессор, микропроцессор, контроллер, микроконтроллер, cortex, M4
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/17120431198ilvpw0xnr/text.html на raw.githubusercontent.com
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
На сайте developer.arm.com имеется документ Cortex-M4 Technical Reference Manual r0p0 с номером DDI 0439 (копия PDF-файла прикреплена к этой записи). Страница с командами Ассемблера расположена по адресу: https://developer.arm.com/documentation/ddi0439/b/CHDDIGAC Нумерация r0p0 означает, что релизный номер документа (release) является 0, и номер изменений (path) тоже 0. То есть, это первая версия такста документа, без изменений и дополнений. В самом документе нижеуказанные сведения находятся в разделе 3.3 на страницах 3-4 - 3-8. Здесь приведен частичный перевод страницы с командами Ассемблера. Важно: в данном документе нет полных описаний того, что выполняет та или иная инструкция. Полное описание инструкций доступно в документе ARM Architecture Reference Manual Thumb-2 Supplement под номером DDI 0308D. * * * Справочное руководство Cortex-M4 r0p0 Список инструкций микропроцессора Cortex-M4 В данном процессоре реализован набор инструкций по стандарту ARMv7-M Thumb. Таблица 3.1 содержит инструкции Cortex-M4 и количество циклов, затрачиваемых на их выполнение. Количество циклов основано на системе с нулевыми состояниями ожидания. В синтаксисе ассемблера, в зависимости от операции, поле <op2> может быть заменено на один из следующих вариантов:
Примечание: здесь, для краткости, приведены не все режимы адресации при загрузке и сохранении. Дополнительную информацию смотрите в справочном руководстве по архитектуре ARMv7-M (ARMv7-M Architecture Reference Manual). В таблице 3.1 в столбце "Циклы" используются следующие значения: P - количество циклов, необходимых для полной загрузки конвейера. Эначение лежит в диапазоне от 1 до 3 в зависимости от ширины целевой инструкции, от того как она выровнена, а также от того, удастся ли процессору заранее вычислить адрес. B - Количество циклов, необходимых для выполнения барьерной операции. Для DSB и DMB минимальное количество циклов равно нулю. Для ISB минимальное количество циклов эквивалентно количеству, необходимого для полной загрузки конвейера. N - Количество регистров в списке регистров, подлежащих загрузке или сохранению (включая PC или LR) W - Количество циклов, затраченных на ожидание соответствующего события. Примечание переводчика. в примерах кода на Ассемблере используются негласные обозначения регистров и прочих сущностей. Например:
Таблица 3.1. Краткое описание набора инструкций Cortex-M4
Подробное описание команд Команда MOV MOV Rd, <op2> Команда MOV передает значение в регистр. Примечание: Через MOV нельзя читать из памяти. Нельзя написать MOV R0, [R1] — вместо этого надо использовать инструкцию LDR. Передача значения из 32-х битного регистра: MOV R0, R1 ; Передача значения регистра R1 в R0 В качестве принимающего регистра может быть регистр общего назначения, и даже регистр PC: MOV PC, R0 Передача непосредственного значения, закодированного в машинной инструкции: MOV R0, #42 ; Передача непосредственного значения в R0 В режиме ARM (32-битные инструкции) можно загрузить 8-битные значения, сдвинутые на чётное число бит (0, 2, 4, ..., 30) влево. Т. е. immediate-значение кодируется в 12 битах: 8 бит - само значение, 4 бита - количество сдвигов (16 возможных значений), причем количество сдвигов умножается на 2. Примеры допустимых: 0xFF (0xFF << 0) 0x3F00 (0x3F << 8) 0xC0000000 (0xC0 << 24) 0x3FC00000 (0xFF << 22) Недопустимые: 0x1234 (нельзя представить как 8-битное + четное кол-во сдвигов). В режиме Thumb (16-битные инструкции) можно передать значение размером 8 бит, команда работает только с R0–R7. В режиме Thumb-2 (расширеннык 32-битные инструкции) можно загружать 16-битные значения. Видно, что ни в одном режиме невозможно загрузить 32-х битное значение. Для загрузки 32-х битных значений используются две инструкции: MOVW / MOVT (см. далее). Передача регистра со сдвигом: MOV R0, R1, LSL #2 ; R0 = R1 << 2 Поддерживаемые сдвиги:
Встает вопрос: а что, а ARM-процессорах нет специальных инструкций сдвига регистров? Конечно, есть. Следующие команды будут давать один и тот же результат: MOV R0, R1, LSL #2 LSL R0, R1, 2 Использование специализированной инструкции вместо MOV может дать в некоторых режимах более компактный машинный код. Команды MOVW / MOVT Команда MOVW - расшифровывается как Move Wide, т. е. перемещение значения регистра с расширением до 32-х бит, и в качестве ресширения используются нули. Эта команда загружает непосредственное 16-бит значение в младшие два байта регистра Rd, а старшие два байта обнуляются: MOVW Rd, #<imm> Команда MOVT (Move to Top) загружает непосредственное 16-бит значение в старшие два байта регистра Rd. Младшие 2 байта не меняются. MOVT Rd, #<imm> Таким образом, эти две команды позволяют за две инструкции загрузить в регистр 32-х битное значение: MOVW R0, #0x5678 ; младшие 16 бит, регистр R0 станет равен 0x00005678 MOVT R0, #0x1234 ; старшие 16 бит, регистр R0 станет равен 0x12345678 Команда ADD Простое сложение: Простое сложение - это сложение без установкии и без учета флага переноса. ADD Rd, Rn, <op2> Например: ADD R0, R1, R2 ; это R0 = R1 + R2 ADD R0, R1, #5 ; это R0 = R1 + 5 Ограничения на непосредственный операнд такие же как и в команде MOV. С помощью ADD можно увеличивать регистр PC на значение из другого регистра: ADD PC, PC, Rm Сложение со сдвигом: ADD R0, R1, R2, LSL #2 ; это R0 = R1+ (R2 << 2) Варианты сдвига (LSL, LSR, ASR, ROR) - такие же как у MOV. Зачем вообще нужна команда сложения со сдвигом? Об этом написано в следующе статье: Если кратко - то очень простая и быстрая математика позволяет за два-три такта считать адрес пикселя по его координатам. То же самое верно и для вычисления адресов элементов массивов, если их горизонтальные размеры кратны двойке или находятся в ряду быстро вычислимых через сдвиг и сложение координат. Команда ADC Это сложение с учетом бита переноса (Add with carry): ADC Rd, Rn, <op2> В качестве второго операнда используются регистр, либо сдвинутый регистр (см. MOV с LSL) или непосредстванное значение. ... Дописать ... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Прикрепленные файлы:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Так же в этом разделе:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||