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

Циклический сдвиг вправо (Rotate Right Register)

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

ROR <Rd>, <Rs>

Формат команды представлен на рис. 2.

Описание

<Rd> – Содержит значение для сдвига, а также регистр результата (см. таблицу 1).

<Rs> – Содержит значение сдвига.

Команда ROR (Rotate Right Register) используется для обеспечения циклического сдвига значения одного регистра на указанное в другом регистре число циклов. Биты, вышедшие за границы справа вставляются на освободившееся место слева. Флаги изменяются в соответствии с результатом.

Действие

ifRs[7:0] == 0then

CFlagне затрагивается

Rd не затрагивается

else if Rs[4:0] == 0 then

C Flag = Rd[31]

Rd= не затрагивается

else/*Rs[4:0] > 0 */

C Flag = Rd[Rs[4:0] - 1]

(Rd) = (Rd) Rotate_Right Rs[4:0]

N Flag = Rd[31]

Z Flag = if (Rd) == 0 then 1 else 0

V Flag не затрагивается

Пример

ROR R1, R0 ; Сдвиг R1 вправо на число бит, указанное в R0,

; результат поместить в R1 и установить флаги условий.

RSBARM

Команда обратного вычитания (reverse substract)

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

RSB {<cond>} {S} <Rd> <Rn> <shifter_operand>

Формат команды представлен на рис. 1.

Описание

<cond> – поле условия (см. таблицу 1).

S– устанавливаетS-бит ­– бит условия (см. таблицу 1).

<Rd> – регистр результата (см. таблицу 1).

<Rn> – регистр первого операнда (см. таблицу 1).

<shifter_operand> – второй операнд (см. таблицу 3).

Команда обратного вычитания уменьшает значение 2-го операнда на значение регистра Rn и помещает результат в регистр Rd.

Если бит S команды равет 1, могут изменятся флаги С и V текущего слова состояния. Возможны два значения:

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

  2. В остальных случаях изменяются только флаги С и V если был произведен заем или переполнение (соотетственно).

Действие

Если условие (<cond>) выполнено, то (Rd) := (shifter_operand) – (Rn). Далее, если S = 1 и R15 задействован как Rd, тогда CPSR = SPSR, иначе (S = 1, R15 не задействован как Rd) тогда формируются флаги N, Z, C, V.

Использование

Команда RSBиспользуется когда необходимо произвести вычитание числа, хранящегося в одном из регистров из числа, которое может быть регистром с сдвигом (Rm), или 8-битной константой с циклическим сдвигом (Imm) (в зависимости от значения бита "I"[25] в команде). Более подробную информацию смотри в таблице 3.

Примеры

RSB R7 R4 R12 // в R7 записывается результат вычитания R4 из R12

RSBS R2 R1 R0 // вычитает R1 из R0 и помещает результат в R2 (воздействует на флаги CPSR)

RSB R3 R5 R5, LSL #2 //вычитает из учетверённого значения R5 значение R5 и записывает результат в R3: R3 = R5*4-R5 = R5*3

RSBEQ R2 R1 R0 // Если Z = 1, вычитает R1 из R0 и помещает результат в R2

RSCARM

Команда обратного вычитания с заемом (Reverse substract with carry)

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

RSС {cond} {S} <Rd> <Rn> <shifter_operand>

Формат команды представлен на рис. 1.

Описание

<cond> – поле условия (см. таблицу 1).

S– устанавливаетS-бит ­– бит условия (см. таблицу 1).

<Rd> – регистр результата (см. таблицу 1).

<Rn> – регистр первого операнда (см. таблицу 1).

<shifter_operand> – второй операнд (см. таблицу 3).

Команда обратного вычитания с заемом уменьшает значение 2-го операнда на значение регистра Rn и инвертированное значение флага переноса, а потом помещает результат в регистр Rd.

Если бит S команды равет 1, могут изменятся флаги С и V текущего слова состояния. Возможны два значения:

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

  2. В остальных случаях изменяются только флаги С и V если был произведен заем или переполнение (соотетственно).

Действие

Если условие (<cond>) выполнено, то (Rd) := (shifter_operand) – (Rn) –NOT(флаг переноса). Далее, еслиS= 1 иR15 задействован какRd, тогдаCPSR=SPSR, иначе (S= 1,R15 не задействован какRd) тогда формируются флагиN,Z,C,V.

Использование

Команда RSС используется когда необходимо произвести вычитание с учётом заема числа, хранящегося в одном из регистров из числа, которое может быть регистром с сдвигом (Rm), или 8-битной константой с циклическим сдвигом.

Примеры

RSC R7 R4 R12 // в R7 записывается результат вычитания R4 из R12

RSCS R2 R1 R0 // вычитает R1 из R0 с учётом флага заема и помещает результат в R2 (воздействует на флаги CPSR)

RSC R3 R5 R5, LSL #2 //вычитает из учетверённого значения R5 значение R5 с учётом флага заема и записывает результат в R3: R3 = R5*4-R5 = R5*3

RSCGE R2 R1 R0 // Если N = V, вычитает R1 из R0 и помещает результат в R2

SBCARM