- •Справочник по системе команд микроконтроллера lpc2000 на базеArm-ядра
- •Введение
- •1. Общие сведения
- •Обработка данных
- •Региcтры cpsr/sprs
- •2. Перечень команд микроконтроллера lpc2000 на базе arm-ядра
- •3. Подробное описание команд микроконтроллера lpc2000 на базе arm-ядра
- •Команда сложения с переносом (Addition with carry)
- •Команда сложения с переносом (Addition with carry)
- •Команда сложения (Addition)
- •Операция сложения без учета флага переноса (Addition)
- •Операция сложения без учета флага переноса (Addition)
- •Операция сложения без учета флага переноса (Addition)
- •Операция сложения без учета флага переноса (Addition)
- •Операция сложения без учета флага переноса (Addition)
- •Команда логического и (And)
- •Команда логического и (and)
- •Команда арифметического сдвига вправо (Arithmetic Shift Right)
- •Команда арифметического сдвига вправо (Arithmetic Shift Right)
- •Переход (Branch)
- •Команда перехода по условию (Branch)
- •Команда безусловного перехода (Branch)
- •Команда сброса битов (Bit Clear)
- •Команда сброса битов (Bit Clear)
- •Контрольные точки (breakpoints)
- •Команда перехода со ссылкой (Branch and Link)
- •Команда перехода со ссылкой (Branch with Link)
- •Команда перехода со ссылкой и сменой режима (Branch with Link and Exchange)
- •Команда перехода со ссылкой и сменой режима (Branch with Link and Exchange)
- •Команда перехода со ссылкой и сменой режима (Branch with Link and Exchange)
- •Переход и переключение режима ядра (Branch and Exchange)
- •Переход и переключение режима ядра
- •Сообщение сопроцессору (Coprocessor Data Processing)
- •Подсчет нулевых битов (Count Leading Zeros)
- •Сравнение с отрицанием (Compare Negative)
- •Сравнение (Compare)
- •Установить флаги регистра cpsr для Rd – Rs.
- •Логическое побитовое «исключающее или» (Exclusive or)
- •Логическое побитовое «исключающее или» (Exclusive or)
- •Загрузить в сопроцессор из памяти (Load Coprocessor)
- •Загрузить в сопроцессор из памяти (Load Coprocessor)
- •Загрузить сразу несколько регистров (Load Multiple)
- •Загрузить сразу несколько регистров (Load Multiple)
- •Загрузить сразу несколько регистров (Load Multiple)
- •Команды множественной загрузки
- •Команда множественной загрузки( Load Multiple Increment)
- •Команда записи слова в регистр (Load Register)
- •Команда однократной передачи данных (Load Register)
- •Команда однократной передачи данных (Load Registr)
- •Команда однократной передачи данных (Load Registr)
- •Команда однократной передачи данных (Load Registr)
- •Команда записи байта в регистр (Load Register Byte)
- •Загрузка байта в регистр из памяти (Load register byte value from memory)
- •Загрузка двойного слова со знаком (Load Reister Doubleword)
- •Команда записи полуслова в регистр (Load Register Halfword)
- •Команда записи полуслова в регистр (Load Register Halfword)
- •Загрузка байта со знаком (Load Register Signed Byte)
- •Команда загрузки знакового байта (Load Register Signed Byte)
- •Загрузка полуслова со знаком (Load Register Signed Halfword)
- •Загрузка регистра полусловом со знаком (Load Register Signed Halfword)
- •Логический сдвиг влево (Logical Shift Left)
- •Логический сдвиг влево (Logical Shift Left)
- •Логический сдвиг вправо (Logical Shift Right)
- •Логический сдвиг вправо (Logical Shift Right)
- •Команда регистрового обмена с сопроцессором
- •Команда регистрового обмена с сопроцессором
- •Команда регистрового обмена с сопроцессором
- •Команда умножения, накопления
- •Загрузить в регистр константу
- •Пересылка (Move)
- •Пересылка (Move)
- •Пересылка (Move)
- •Команда перемещения данных из сопроцессора в arm регистр (Move to arm Register from Coprocessor)
- •Команда перемещения данных из сопроцессора в два регистра arm одновременно
- •Запись psr в регистр общего назначения (Move psr to General-purpose Register)
- •Запись в регистр состояния (Move to Status Register from arm Register)
- •Умножение (Multiply)
- •Умножение (Multiply)
- •Пересылка инверсии (Move Not)
- •Пересылка с инверсией (Move not)
- •Команда инвертирования (Negate)
- •Нет операции (No oPeration)
- •Логическое или (or)
- •Команда логического или (Or)
- •Команда перезагрузки кэша (a cache preload instruction)
- •Команда презагрузки кэша
- •Команда извлечения из стека (pop)
- •Размещение регистров в вершине стека
- •Команда добавление сразу нескольких операндов
- •Команда добавление сразу нескольких операндов с удвоением одного из них
- •Команда приведённого вычитания с удвоением второго операнда (double saturated substraction)
- •Команда приведённого вычитания (saturated substraction)
- •Циклический сдвиг вправо (Rotate Right Register)
- •Команда обратного вычитания (reverse substract)
- •Команда обратного вычитания с заемом (Reverse substract with carry)
- •Команда вычитания с заемом (Substract with carry)
- •Вычитание с переносом (Subtract with Carry)
- •Команда умножения числа со знаком и с накоплением
- •Команда умножения числа со знаком и накоплением
- •Знаковая операция умножения и сложения
- •Команда знакового умножения двух 16-ти битных операндов (Signed multyply)
- •Знаковая операция умножения
- •Команда обмена данными с сопроцесcором
- •Команда обмена данными с сопроцессором
- •Команда обмена данными с сопроцесcором
- •Команда обмена данными с сопроцессором
- •Команда группового хранения (Store Multiple )
- •Соответствия между мнемониками и состояниями битов команд
- •Сохранение не пустого подмножества рон (Store Multiple Increment After)
- •Команда сохранения регистра в памяти(Store Register )
- •Сохранение в памяти 32-х разрядных данных из рон (Store Register)
- •Сохранение в памяти 32-х разрядных данных из рон (Store Register)
- •Сохранение в памяти 32-х разрядных данных из рон (Store Register)
- •Команда сохранения регистра в памяти(Store Register Byte ) (байта)
- •Сохранение в памяти 8-ми разрядных данных из рон (Store Register)
- •Запоминание 2х слов (Stores two words).
- •Команда передачи полуслова между Lo регистром и памятью.
- •Команда сохранения значения регистра (Store Register Halfword)
- •Вычитание (Subtraction).
- •Команда вычитания (Subtract)
- •Команда программного прерывания (Software Interrupt)
- •Команда программного прерывания (Software Interrupt)
- •Команда обмена (Swap)
- •Команда обмена (Swap Byte)
- •Побитовая проверка на равенство (Test Equivalence)
- •Проверка битов (test)
- •Команда сравнения (Test)
- •Список литературы
Команда вычитания с заемом (Substract with carry)
Синтаксис в ассемблере
SBC {<cond>} {S} <Rd> <Rn> <shifter_operand>
Формат команды представлен на рис. 1.
Описание
<cond> – поле условия (см. таблицу 1).
S– устанавливаетS-бит – бит условия (см. таблицу 1).
<Rd> – регистр результата (см. таблицу 1).
<Rn> – регистр первого операнда (см. таблицу 1).
<shifter_operand> – второй операнд (см. таблицу 3).
Команда вычитания с заемом уменьшает значение регистра Rn на значение 2-го операнда и инвертированное значение флага переноса, а потом помещает результат в регистр Rd.
Если бит S команды равет 1, могут изменятся флаги С и V текущего слова состояния. Возможны два значения:
Если результат записывается в R15, вместо текущего слова состояния (CPSR) записывается сохранённое (SPSR).
В остальных случаях изменяются только флаги С и V если был произведен заем или переполнение (соотетственно).
Действие
Если условие (<cond>) выполнено, то (Rd) := (Rn) – (shifter_operand) –NOT(флаг переноса). Далее, еслиS= 1 иR15 задействован какRd, тогдаCPSR=SPSR, иначе (S= 1,R15 не задействован какRd) тогда формируются флагиN,Z,C,V.
Использование
Команда SBCиспользуется когда необходимо произвести вычитание с учётом заема числа, которое может быть регистром с сдвигом (Rm), или 8-битной константой с циклическим сдвигом из числа, хранящегося в одном из регистров сопроцессора.
Примеры
SBC R7 R4 R12 // в R7 записывается результат вычитания R12 из R4
SBCS R2 R1 #3 // вычитает из R1 число 3 с учётом флага заема и помещает результат в R2 (воздействует на флаги CPSR)
SBC R3 R4 R5, LSL #2 //вычитает из R4 учетверённое значение R5 значение R5 с учётом флага заема и записывает результат в R3: R3 = R4-R5*4-NOT(C flag)
SBCVS R7 R4 R12 // Если V=1, в R7 записывается результат вычитания R12 из R4
SBC – THUMB
Вычитание с переносом (Subtract with Carry)
Синтаксис в ассемблере
SBC <Rd>, <Rm>
Формат команды представлен на рис. 2.
Описание
<Rd> – Первый операнд - уменьшаемое, а также результат (см. таблицу 1).
<Rm> – Вычитаемое (см. таблицу 1).
Команда SBC (Subtract with Carry) выполняет вычитание с учётом регистра пареноса
Действие
(Rd) = (Rd) – (Rm) - NOT(C Flag)
N Flag = Rd[31]
Z Flag = if (Rd) == 0 then 1 else 0
C Flag = NOT BorrowFrom((Rd) – (Rm) - NOT(C Flag))
V Flag = OverflowFrom((Rd) – (Rm) - NOT(C Flag))
Пример
SBC R1, R3 ;R1 := R1 – R3 - NOT Carry
SMLA<x><y> – ARM
Синтаксис в ассемблере
SMLA<x><y> {<cond>} <Rd>, <Rm>, <Rs>, <Rn>
Формат команды представлен на рис. 1.
Описание
<x> – Определяет, какя часть исходного регистра <Rm> использует, как первый умножающий операнд. Если <x> - B, то x == 0 и используется в основании (биты[15:0]) регистра <Rm>. Если <x > - T, то x == 1 и используется в начале (биты[31:16]) регистра <Rm>.
<y> – Определяет, какя часть исходного регистра <Rs> использует, как второй умножающий операнд. Если <y> - B, то y == 0 и используется в основании (биты[15:0]) регистра <Rs>. Если <y > - T, то y == 1 и используется в начале (биты[31:16]) регистра <Rs>.
<cond> – поле условия (см. таблицу 1).
<Rd> – регистр результата (см. таблицу 1).
<Rn> – регистр первого операнда (см. таблицу 1).
<Rm> – регистр второго операнда (см. таблицу 1).
<Rs> – Определяет исходный регистр, отобранный – <y>– основание или начало, второго умножающего операнда.
Команда SMLA<y><x> выполняет знаковую операцию умножения и сложения. Операция умножения применяется в двух по 16-бит, или с вершины или от основания соответствующих исходных регистров. Другие части регистров игнорируется. 32 бита добавляются к 32 битам накоплевающей части и результат записывается в регистр.
Если выходит за пределы при выполнении операции сложения ставим флаг Q в CPSR. Но переполнение невозможно при выполнении умножения.
Использование
В дополнение к его прямому использованию – умножение и сложения целого числа, есть более быстрая альтернатива следующих команд Q31 x Q15 + Q31 —> Q31 синтезируемых от SMULW<y> и QDADD.
Обстоятельства, при которых это условие возможно:
* если известно насыщенность и/или переполнение не могут произойти в течении вычисления.
* если известно насыщенность и/или переполнение не могут произойти в течении вычисления, но предполагается использовать флаг Q, чтобы обнаружить и предпринять коррективное действие.
Примеры
Следующий листинг производит точечный продукт четырех Ql5 чисел к R0 и R1 четырьмя числами Q15 в R2 и R3:
SMULBB R4, RO, R2
QADD R4, R4, R4
SMULTT R5, RO, R2
QDADD R4, R4, R5
SMULBB R5, Rl, R3
QDADD R4, R4, R5
SMULTT R5, Rl, R3
QDADD R4, R4, R5
При отсутствии насыщения есть более быстрая альтернатива:
SMULBB R4, RO, R2
SMLATT R4, RO, R2, R4
SMLABB R4, Rl, R3, R4
SMLATT R4, Rl, R3, R4
QADD R4, R4, R4
SMLAL<x><y> – ARM
