Поиск по сайту: |
|
По базе: |
|
Главная > Обзоры по типам > Микроконтроллеры > ARM > Система команд |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Обработка данныхЭта команда будет выполнена, если условие истинно. Все различные условия перечислены в табл. 6. Машинный код команды приведен на рис.13.
Команда формирует результат, выполняя указанную арифметическую или логическую операцию с одним или двумя операндами. Первый операнд - всегда регистр (Rn). Второй операнд может быть регистром с сдвигом (Rm), или 8-битной константой с циклическим сдвигом (Imm) (в зависимости от значения бита "I" в команде). Флаги CPSR могут оставаться без изменений (S = 0) или выставлены в зависимости от результата выполнения этой команды (S = 1). Некоторые операции в команде (ТЕСТ, TEQ, CMP, CMN) не записывают результат в регистр Rd. Они используются только для того, чтобы в зависимости от результата установить/сбросить флаги CPSR (только при S = 1). Команды и результаты их работы перечислены в табл. 7. Флаги регистра CPSR Все операции обработки данных разделяются на логические и арифметические. Логические операции (AND, EOR, ТЕSТ, TEQ, ORR, MOV, BIC, MVN) выполняют логические побитовые операции на всех битах операнда или операндов. Если бит команды "S" будет установлен (и Rd - это не R15, см. ниже), то состояние флага "V" в регистре CPSR не изменится; флаг переноса "C" будет установлен исходя из результата многорегистрового циклического сдвига (или останется без изменений, если операция изменения сдвига - LSL #0). Флаг "Z" будет установлен, только если результат - все нули, и флаг "N" будет установлен в зависимости от значения бита 31 результата операции. Таблица 7. Команды обработки данных в режиме ARM
Арифметические операции (SUB, RSB, ADD, ADC, SBC, RSC, CMP, CMN) обрабатывают каждый операнд как 32-битное целое число (беззнаковое или знаковое с дополнением до 2-х, что, впрочем, эквивалентно). Если бит "S" будет установлен (и Rd - это не R15) и произойдет переполнение результата, то флаг "V" в регистре CPSR будет установлен. Однако, этот флаг можно игнорировать, если операнды - беззнаковые, но обязательно нужно учитывать для знаковых операндов. Флаг "C" будет установлен при переносе бита 31 из ALU (переполнение). Флаг "Z" будет установлен, только если результат нулевой. Флаг "N" будет установлен в зависимости от значения бита 31 результата операции (указывает на отрицательный результат, если предполагается, что операнды есть знаковые с дополнением до 2-х). Команды сдвига Когда второй операнд определен как сдвиговый регистр, то операцией регистрового циклического сдвига управляет поле Shift в самой команде. Это поле указывает тип сдвига, который будет выполнен: логический сдвиг влево или вправо, арифметический сдвиг право, или циклический сдвиг вправо. Число бит, на которое будет произведен сдвиг, находится или в старшей части операнда 2 (сдвиг регистра кроме R15 при I = 0) или его в старших 4-х битах (сдвиг константы при I = 1). Подробное описание для различных типов сдвигов приведено на рис. 14.
Команды с заранее известным числом сдвигов Заданное количество сдвигов содержится в 5-битном поле, содержимое которого может иметь значение от 0 до 31. Логический сдвиг влево (LSL) выполняет перемещение влево каждого бита содержимого регистра Rm указанное число раз. Младшие значащие биты заполняются нулями, а старшие разряды - "выталкиваются" (перенос), кроме случая, если команда - логическая (см. выше), то при этом самый старший бит копируется во флаг переноса C регистра CPSR. Для примера действия команды LSL #5 приведены на рис. 15.
Примечание: особого рассмотрения требует команда LSL #0, в которой выталкиваемый бит (перенос) равен прежнему содержимому флага C регистра CPSR. Содержимое Rm используется непосредственно в качестве 2-го операнда. Команда логического сдвига вправо (LSR) похожа на команду LSL, с одной лишь разницей: содержимое регистра Rm сдвигается в сторону младших бит. Для примера на рис. 16 изображен принцип работы команды LSR #5.
Так как команда LSR #0 в принципе не выполняет никаких действий, и по причине ограниченного размера поля сдвига (shift) не может существовать команды LSR #32 (результат работы которой: операнд 2 = нулю), то решено было заменить LSR #32 командой LSR #0 (это относится и к команде LSL #32). По этой причине оптимизатор ассемблера заменит команды LSR #0, ASR #0, POR #0 командой LSL #0, хотя фактически будет выполняться команда LSL #32. Команда арифметического сдвига вправо (ASR) выполняет те же действия, что и команда логического сдвига вправо (LSR), с одной разницей в том, что в старшие биты результата копируется содержимое бита 31 регистра Rm, вместо нулей. Так как 31-бит является знаком числа, то это позволяет сохранить этот знак (подразумеваются знаковые числа с дополнением до 2-х). Для примера на рис. 17 изображен принцип работы команды ASR #5.
Команда ASR #0 (аналогично LSR #0) используется взамен команды ASR #32. В этом случае бит 31 регистра Rm также используется в роле переноса, а результат целиком состоит либо из одних единиц, либо из одних нулей, в зависимости от значения бита 31 регистра Rm. Команда циклического сдвига вправо (ROR) производит побитовые сдвиги вправо с переносом младшего вытесненного бита 0 (перенос) в старший бит 31. Для примера на рис. 18 изображен принцип работы команды ROR #5.
Команда расширенного сдвига вправо (RRX) выполняет те же действия, что и команда ROR #0. Во время выполнения этой команды производится сдвиг на один бит вправо 33-битного регистра, получаемого добавлением (не сложением) к старшему значащему биту регистра Rm флага C регистра CPSR (рис.19).
Команды с число сдвигов, определяемым регистром Только самый старший байт регистра Rs используется для указания числа операций сдвига. В качестве регистра Rs может быть использован любой регистр общего назначения, кроме регистра R15 (в противном случае результат выполнения команды непредсказуем). Если этот байт равен нулю, то неизменное содержимое регистра Rm будет использовано в качестве второго операнда. При этом прежнее значение флага C регистра CPSR будет передано в качестве результата переноса команды сдвига. В случае, если содержимое этого байта находится в диапазоне от 1 до 31 (включительно), то результат команды сдвига будет в точности соответствовать результату выполнения команды, в которой число операций сдвига задано в виде константы (рис. 14). И, наконец, если значение этого байта равно 32 или более, то команда разделяется на следующие варианты результата ее выполнения:
Примечание: 7-й бит в старшем байте регистра Rs обязательно должен быть равен нулю, в противном случае команда будет расценена как команда умножения или неизвестная команда. Команды сдвига констант Поле сдвига константы - 4-битное целое беззнаковое число, которое указывает число операций сдвига 8-битной константы - байта. Это значение расширятся до 32-битного с дополнением слева нулями, и затем циклически сдвигается вправо на 2 бита. Эти манипуляции позволяют генерировать большую часть часто применяемых констант, например, все значения степени двойки. Запись в регистр R15 Если S = 1 и Rd № R15, т.е. в качестве Rd используются любой из регистров, кроме R15, то содержимое флагов регистра CPSR обновиться из флагов АЛУ, как это описано ранее. Если S = 0 и Rd = R15, то результат выполнения команды помещается в регистр R15, не оказывая никакого влияния на флаги регистра CPSR. Если S = 1 и Rd = 15, то результат выполнения команды помещается в регистр R15 и соответствующий регистр SRPS текущего режима копируется в регистр CPSR. При изменении состояния ядра это позволяет одновременно восстанавливать и регистр PC и регистр CPSR. Недопустимо использование такого варианта команды в привилегированном режиме (User Mode). Использование регистра R15 в качестве операнда Если R15 (регистр PC) используется в качестве операнда в командах обработки данных, то этот регистр используется в команде непосредственно. Значение PC в этом случае станет адресом текущей команды плюс 8 или 12 байт в зависимости от типа команды: если число сдвигов непосредственно определено в команде, то PC будет указывать на 8 байт вперед; если используется команда, в которой число сдвигов определено в регистре, то PC будет указывать на 12 байт вперед относительно текущей команды. Коды команды: TEQ, TST, CMP и CMN Примечание: команды TEQ, TST, CMP и CNM во время выполнения оказывают влияние только на флаги регистра CPSR, и при этом регистр назначения Rd изменению не подвергается. Команда TEQP (разновидность команды TEQ) использовалась в ранних версиях ARM процессоров и поэтому не должна применяться: вместо этой команды должны быть использованы команды по передаче регистров PSR. Выполнение команды TEQP в ядре ARM7TDMI произведет перенос регистра SPSR_<режим> в регистр CPSR, если процессор находится в привилегированном режиме, в противном случае команда TEQP не выполнит никаких действий (непривилегированный режим). Число машинных тактов выполнения Число машинных тактов выполнения команд обработки данных зависит от типа самой команды (табл. 8). Таблица 8. Число машинных тактов при выполнении команд обработки данных
S, N и I зависят от типа машинных тактов. Синтаксис в ассемблере
где:
Пример
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
|
Впервые? | Реклама на сайте | О проекте | Карта портала тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru ©1998-2023 Рынок Микроэлектроники |
|