Поиск по сайту:

 


По базе:  

микроэлектроника, микросхема, микроконтроллер, память, msp430, MSP430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, SED1335, mega128, avr, mega128  
  Главная > Обзоры по типам > Микроконтроллеры > ARM > Система команд

реклама

 




Мероприятия:




Обработка данных

Эта команда будет выполнена, если условие истинно. Все различные условия перечислены в табл. 6. Машинный код команды приведен на рис.13.

Команда обработки данных
Рис 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

Мнемоника ассемблера Код Действие
AND 0000 операнд1 AND операнд2
EOR 0001 операнд1 EOR операнд2
SUB 0010 операнд1 - операнд2
RSB 0011 операнд2 - операнд1
ADD 0100 операнд1 + операнд2
ADC 0101 операнд1 + операнд2 + перенос
SBC 0110 операнд1 - операнд2 + перенос - 1
RSC 0111 операнд2 - операнд1 + перенос - 1
TST 1000 как AND, но результат не будет записан
TEQ 1001 as EOR, но результат не будет записан
CMP 1010 as SUB, но результат не будет записан
CMN 1011 as ADD, но результат не будет записан
ORR 1100 операнд1 OR операнд2
MOV 1101 операнд2 (операнд1 игнорируется)
BIC 1110 операнд1 AND NOT операнд2 (бит сброшен)
MVN 1111 NOT операнд2 (операнд1 игнорируется)

Арифметические операции (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.

Команды сдвига в режиме ARM
Рис 14. Команды сдвига в режиме ARM

Команды с заранее известным числом сдвигов

Заданное количество сдвигов содержится в 5-битном поле, содержимое которого может иметь значение от 0 до 31. Логический сдвиг влево (LSL) выполняет перемещение влево каждого бита содержимого регистра Rm указанное число раз. Младшие значащие биты заполняются нулями, а старшие разряды - "выталкиваются" (перенос), кроме случая, если команда - логическая (см. выше), то при этом самый старший бит копируется во флаг переноса C регистра CPSR. Для примера действия команды LSL #5 приведены на рис. 15.

Логический сдвиг влево
Рис 15. Логический сдвиг влево

Примечание: особого рассмотрения требует команда LSL #0, в которой выталкиваемый бит (перенос) равен прежнему содержимому флага C регистра CPSR. Содержимое Rm используется непосредственно в качестве 2-го операнда.

Команда логического сдвига вправо (LSR) похожа на команду LSL, с одной лишь разницей: содержимое регистра Rm сдвигается в сторону младших бит. Для примера на рис. 16 изображен принцип работы команды LSR #5.

Логический сдвиг вправо
Рис 16. Логический сдвиг вправо

Так как команда 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.

Арифметический сдвиг вправо
Рис 17. Арифметический сдвиг вправо

Команда ASR #0 (аналогично LSR #0) используется взамен команды ASR #32. В этом случае бит 31 регистра Rm также используется в роле переноса, а результат целиком состоит либо из одних единиц, либо из одних нулей, в зависимости от значения бита 31 регистра Rm.

Команда циклического сдвига вправо (ROR) производит побитовые сдвиги вправо с переносом младшего вытесненного бита 0 (перенос) в старший бит 31. Для примера на рис. 18 изображен принцип работы команды ROR #5.

Циклический сдвиг вправо
Рис 18. Циклический сдвиг вправо

Команда расширенного сдвига вправо (RRX) выполняет те же действия, что и команда ROR #0. Во время выполнения этой команды производится сдвиг на один бит вправо 33-битного регистра, получаемого добавлением (не сложением) к старшему значащему биту регистра Rm флага C регистра CPSR (рис.19).

Расширенный циклический сдвиг вправо
Рис 19. Расширенный циклический сдвиг вправо

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

Только самый старший байт регистра Rs используется для указания числа операций сдвига. В качестве регистра Rs может быть использован любой регистр общего назначения, кроме регистра R15 (в противном случае результат выполнения команды непредсказуем).

Если этот байт равен нулю, то неизменное содержимое регистра Rm будет использовано в качестве второго операнда. При этом прежнее значение флага C регистра CPSR будет передано в качестве результата переноса команды сдвига.

В случае, если содержимое этого байта находится в диапазоне от 1 до 31 (включительно), то результат команды сдвига будет в точности соответствовать результату выполнения команды, в которой число операций сдвига задано в виде константы (рис. 14).

И, наконец, если значение этого байта равно 32 или более, то команда разделяется на следующие варианты результата ее выполнения:

  1. Результат логического сдвига влево (LSL) на 32 - ноль, перенос равен биту 0 регистра Rm.
  2. Результат LSL на более чем 32 - ноль, перенос тоже равен нулю.
  3. Результат LSR на 32 - ноль, перенос равен биту 31 регистра Rm.
  4. Результат LSR на более чем 32 - ноль, перенос тоже равен нулю.
  5. Результат ASR на 32 и более заполнен значением 31-го бита регистра Rm. Перенос имеет то же значение.
  6. Результат ROR на 32 - содержимое Rm, перенос равен биту 31 регистра Rm.
  7. Результат ROR на 32 и более - тот же, что и в случае ROR на (n-32). Поэтому необходимо вычитать 32 из n до тех пор пока, результат не окажется в диапазоне 1..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. Число машинных тактов при выполнении команд обработки данных

Тип команды Тактов
Обычная обработка данных 1S
Обработка данных с числом сдвигом, указанном в регистре 1S + 1I
Обработка данных с записью в регистр PC 2S + 1N
Обработка данных с числом сдвигом, указанном в регистре, и записью в регистр PC 2S + 1N + 1I

S, N и I зависят от типа машинных тактов.

Синтаксис в ассемблере

  1. MOV,MVN (команды с одним операндом)
    <opcode>{cond}{S} Rd,<Op2>
    
  2. CMP,CMN,TEQ,TST (команды без записи результата - без Rd)
    <opcode>{cond} Rn,<Op2>
    
  3. AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC
    <opcode>>{cond}{S} Rd,Rn,<Op2>
    

где:

- <Op2> - это Rm{,<shift>} или {,<#выражение>}
- {cond} - двухсимвольная мнемоника условия (см. табл. 6).
- {S} - разрешить условное выполнение (для команд CMP, CMN, TEQ, TST).
- Rd, Rn и Rm - выражения, результат вычисления которых - номер регистра общего назначения.
- <#выражение> - если это поле используется, то ассемблер попытается сгенерировать команду сдвига 8-битной константы с соответствии с указанным выражением. Если это невозможно, то возникнет ошибка.
- <shift> - <тип_сдвига> <регистр> или <тип_сдвига> #выражение, или RRX (расширенный циклический сдвиг вправо).
- <shiftname> - ASL, LSL, LSR, ASR, ROR. (так как ASL - синоним LSL, то для обеих команд будет сгенерирован одинаковый машинный код).

Пример

    ADDEQ R2,R4,R5          ; Если Z = 1, то R2:=R4+R5
    TEQS  R4,#3             ; Проверить R4 на равенство 3
                            ; (ассемблер автоматически установит в единицу бит S)
    SUB   R4,R5,R7,LSR R2   ; Логический сдвиг вправо R7 на такое число бит,
                            ; которое указано в старшем байте регистра R2, 
                            ; затем вычесть результат из R5 и разместить его в R4.
    MOV   PC,R14            ; Возврат из подпрограммы.
    MOVS  PC,R14            ; Возврат из исключения и восстановление CPSR
                            ; из SPSR_mode.


Вернуться к Системе команд






 
Впервые? | Реклама на сайте | О проекте | Карта портала
тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru
©1998-2023 Рынок Микроэлектроники