|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Краткая документация по командам ассемблера ARM для процесора Cortex M4
Время создания: 02.04.2024 10:31
Текстовые метки: arm, документация, синтаксис, ассемблер, инструкции, список, перечень, процессор, микропроцессор, контроллер, микроконтроллер, cortex, M4
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/17120431198ilvpw0xnr/text.html на raw.github.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 Поддерживаемые сдвиги:
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. Зачем нужна команда сложения со сдвигом? Например для быстрого вычисления адреса пикселя на стандартных экранах через два-три сдвига и пару сложений. Если в процессоре существуют операции "сложение со сдвигом", то можно уместиться в две-три машинные команды, причем не используя умножение. А команды сдвига и сложения в ARM исполняются за один такт. Таким образом за 2 такта можно высчитать адрес, даже если в процессоре нет блока умножения. К примеру, R1 - это X, R2 - это Y. Если один пиксель занимает 1 байт (да, это 256 цветов на пиксель с использованием палитры), то чтобы получить адрес пикселя, надо Y умножить на ширину экрана (получится адрес начала линии с номером Y), и прибавить X. Стандартные ширины экранов устроены таким образом, что умножать на ширину можно просто одним-тремя сдвигами. Что имеется в виду? Вот какие ширины бывают: 320 pix (это 256 + 64) 640 pix (это 512 + 128) 800 pix (это 512 + 256 + 32) 1024 pix (это 1024) 1280 pix (это 1024 + 256) и т.д. Если ширина 1280, то чтобы получить адрес начала линии с номером Y, надо сделать два сдвига Y и одно сложение: Адрес начала линии = Y * 1280 = Y * (1024 + 256) = Y * 1024 + Y * 256 = Y * 2^10 + Y * 2^8 = (Y << 10) + (Y << 8) А чтобы получить адрес пикселя надо еще прибавить X: Адрес пикселя = (Y << 10) + (Y << 8) + X Эти вычисления на ARM укладываются в две команды: ADD R3, R2, R1, LSL #8 ; R3 = (Y << 8) + X ADD R0, R3, R1, LSL #10 ; R0 = (Y << 10) + R3 В результате в R0 лежит адрес пикселя. Команда ADC Это сложение с учетом бита переноса (Add with carry): ADC Rd, Rn, <op2> В качестве второго операнда используются регистр, сдвинутый регистр (см. MOV с LSL) или непосредстванное значение. ... Дописать ... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Прикрепленные файлы:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Так же в этом разделе:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|