Скачиваний:
75
Добавлен:
01.05.2014
Размер:
1.22 Mб
Скачать

Команда вычитания с заемом (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 текущего слова состояния. Возможны два значения:

  1. Если результат записывается в R15, вместо текущего слова состояния (CPSR) записывается сохранённое (SPSR).

  2. В остальных случаях изменяются только флаги С и 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