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

Команда логического и (and)

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

AND<Rd>, <Rm>

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

Описание

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

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

Команда ANDпроизводит операцию логического “И” со значениями регистров <Rd> и <Rm> и записывает результат в регистре <Rd>. В зависимости от результата происходит обновление флагов полей условия (см. таблицу 4).

Действие

(Rd) = (Rd) AND (Rm).

формируются флаги N,Z; флагиC,V춽е задействуются.

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

Команда ANDчаще всего используется для распознания одного из битов регистра путем проведения операции «И» с маской, в которой “1” стоит в распознаваемом бите, а ‘0” во всех остальных битах.

Пример

ANDR1,R2

В регистр R1 записывается значение результата выполнения операции логического “И” над регистрамиR1 иR2.

ASR(1) – THUMB

Команда арифметического сдвига вправо (Arithmetic Shift Right)

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

ASR <Rd> , <Rm> , #<immed_5>

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

Описание

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

<Rm> – регистр, содержащий переменную, которую надо сдвинуть (см. таблицу 1).

<immed_5> – определяет величину сдвига, в диапазоне от 1 до 32 (см. таблицу 1). Сдвиг от 1 до 31 кодируется непосредственно, а на 32 в видеimmed_5=0.

Эта разновидность команды ASR выполняет арифметический сдвиг переменной, хранящейся в регистре <Rm>, вправо на число бит, указанное в 5-ти битной константе <immed_5>. Результат записывается в регистр < Rd>.

В зависимости от результата происходит обновление флагов полей условия (см. таблицу 4).

Действие

(Rd) = (Rm) >> #<immed_5>.

формируются флаги N,Z,C: флагVне задействован.

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

Команда ASRиспользуется для деления беззнакового числа на константу, равную степени двойки.

Примеры

ASRR2,R5, #27

Арифметический сдвиг вправо на 27 бит содержимого R5 и запись результат в регистрR2.

ASRR2,R0, #31

Получаем 0 или 1 в зависимости от знака R0.

ASR(2) – THUMB

Команда арифметического сдвига вправо (Arithmetic Shift Right)

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

ASR <Rd> , <Rs>

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

Описание

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

<Rs> – регистр, содержащий величину сдвига (см. таблицу 1).

Эта разновидность команды ASR выполняет арифметический сдвиг переменной, хранящейся в регистре <Rd>, вправо на число бит, указанное в регистре <Rs>. Результат записывается в регистр < Rd>.

В зависимости от результата происходит обновление флагов полей условия (см. таблицу 4).

Действие

(Rd) = (Rd) >> <Rs>.

формируются флаги N,Z,C: флагVне задействован.

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

Команда ASRиспользуется для деления беззнакового числа на константу, равную степени двойки.

Пример

ASRR2,R5

Арифметический сдвиг вправо на R5 бит содержимогоR2 и запись результат в регистрR2.

B – ARM

Переход (Branch)

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

B {<cond>} <выражение>

формат команды перехода

Описание

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

<выражение> – выражение для вычисления смещения перехода.

Команда перехода, используется для перехода в определенное место программы, в зависимости от условия (возможен безусловный переход).

Команда будет выполнена, если условие истинно. Все различные условия перечислены в таблице 1.

Команда перехода содержит знаковое 24-битное смещение, дополненное до 2-х. По-сути происходит умножение смещения на 4 и добавление к регистру PC с учетом знака. Таким образом, возможен переход в диапазоне +32 Мбайта.

Переходы за пределы +32 Мбайта должны использовать смещение или абсолютный адрес, который был предварительно загружен в регистр. В этом случае необходимо PC сохранить вручную в регистре R14 (если используется команда "переход со ссылкой").

Адрес, куда осуществляется переход, рассчитывается так:

  1. дополняем 24-битное значение до 32 бит;

  2. сдвигаем результат на 2 бита влево;

  3. прибавляем получившееся число к содержимому РС (который содержит адрес команды перехода) и прибавляем 8.

Адрес метки может быть смещен относительно текущего значения PC в диапазоне ± 32 Мb.

Действие

Если условие (<cond>) выполнено, то

PC = PC + (SignExtend(signed_immed_24) << 2).

Примеры

CMP R1,#10 // сравнить R10 и #10

BEQ val_ok // переход к метке val_ok

val_ok:

val_err:

B val_err // переход к себе же (бесконечный цикл)

B(1) – THUMB