Itte в сборе рук
Что делает следующая строка в сборке рук:
000031e6 2916 cmp r1, #22
000031e8 bf1a itte ne
Я получаю первую строку (сравнивая значения от r1 до 22), но что касается второй строки (я никогда не видел, чтобы команда itte раньше и googling ничего не возвращала)
Ответы
Ответ 1
Это инструкция ARM IF-THEN-ELSE, которая была введена в наборе команд Thumb-2. (Исходя из вашего конкретного примера выше, было бы полезно, если бы вы показали следующие 3 инструкции, которые следуют инструкциям ITTE
, вы поймете, почему, когда вы закончите читать этот ответ.)
Эта команда используется для обработки небольших последовательностей условного кода, до 4-х инструкций. Подумайте об этом как о другом способе реализации условного выполнения ARM (например, BNE - инструкция перехода выполняется только в том случае, если флаг нуля не установлен).
Преимущество этого заключается в том, что он избегает штрафа за получение ветки (предположительно, вы узнали о конвейерах и т.д.)
Эта инструкция немного задействована, но как только вы обворачиваете ее вокруг, она довольно элегантна.
Он принимает форму:
IT<x><y><z><cond>
где x
, y
и z
являются необязательными и должны быть либо T
(для "then" ), либо E
(для "else" ). <cond>
- любое из таких условий, как NE
или EQ
или GT
и т.д., которые отражаются в флагах APSR.
Итак, у вас всегда есть один T
, следующий за I
(инструкция IT
после всех!), а затем 0-3 E
или T
. Для каждого T
и каждого E
вы должны иметь следующую команду в том же порядке, который соответствует. Каждая соответствующая последующая команда должна иметь условия, которые соответствуют инструкциям IT
.
Почувствуйте меня, я знаю, что это сбивает с толку. Здесь я приведу несколько примеров.
Минимальная форма инструкции будет выглядеть примерно так:
IT LT
SUBLT.W R2, R1
В этом случае, если LT
истинно (за флаги APSR), вычитание будет иметь место. Обратите внимание, что LT
в SUB
соответствует LT
в инструкции IT
.
Полномасштабный пример будет выглядеть примерно так:
ITETT NE
ADDNE R0, R0, R1
ADDEQ R0, R0, R3
ADDNE R2, R4, #1
MOVNE R5, R3
Итак, мы имеем ТОЛЬКО ТОЛЬКО ТОЛЬКО (TETT
) с условием NE
. Обратите внимание, что в следующих 4 условных инструкциях (4 инструкции, 1 для TETT
), инструкции "THEN" имеют условие NE
, а команда "ELSE" (вторая инструкция после команды IT
) - помните E был вторым из 4 E и T) имеет противоположное условие. Это не может быть ничего, т.е. Это была бы ошибка, если бы это было что-то вроде LT
вместо EQ
. EQ
противоположно NE
.
Итак, если NE
истинно, тогда будут выполняться команды 1, 3 и 4. В противном случае (EQ
) будет выполняться только команда 2 (ADDEQ
).
Я привел примеры 1 и 4 инструкций, но вы также можете иметь 2 (IT{T,E}
) и 3 команды (IT{T,E}{T,E}
).
Наконец, чтобы привести домой точку, я приведу пример того, как следующий код C может быть реализован с помощью этой инструкции:
if (R4 == R5)
{
R7 = R8 + R9;
R7 /= 2;
}
else
{
R7 = R10 + R11;
R7 *= 2;
}
преобразуется в
CMP R4, R5
ITTEE EQ
ADDEQ R7, R8, R9 ; if R4 = R5, R7 = R8 + R9
ASREQ R7, R7, #1 ; if R4 = R5, R7 /= 2
ADDNE R7, R10, R11 ; if R4 != R5, R7 = R10 + R11
LSLNE R7, R7, #1 ; if R4 != R5, R7 *=2
Это должно дать вам достаточно, чтобы пожевать на некоторое время.
Ответ 2
Кажется, что часть семейства команд IT
(if-then
): http://infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf (вторая страница). Основная инструкция IT
, а затем у вас есть T
для "then" и E
для "else", чтобы дать ITTE
, а код условия NE
== "не равен".
Ответ 3
Простыми словами ITTE
выполняет следующее 3 выполнение как IF THEN {} THEN {} ELSE {} в соответствии с инструкцией cmp
.
В ARMv6T2 и более поздних архитектурах вы можете использовать инструкцию IT
для условного выполнения. В архитектурах до ARMv6T2 нет инструкции IT
, и поэтому инструкции Thumb не могут выполняться условно, кроме инструкции по расписанию B
. Ассемблер проверяет IT-инструкции, но опускает их при сборке с кодом ARM.
Для вашего решения сначала можно понять синтаксис простой инструкции IT
(введенной в Thumb 2) сборки ARM, которая является базой ITTE
.
IT{pattern} {cond}
If-then устанавливает условия выполнения для 4 следующих инструкций
может быть любая комбинация из трех букв T (then) и E (else), первая инструкция после IT всегда является cond (T). Инструкции, которые могут изменять счетчик программ, должны быть последними в IT-блоке.
Условия then
должны соответствовать коду условия, и любые условия else
должны быть противоположным условием. В таблице ниже приведены коды условий и их противоположности:
![введите описание изображения здесь]()
Поймите другую инструкцию cmp
.
CMP Rn, #imm
Rn должен быть регистром Lo. диапазон погрешности 0-255.
Эти инструкции обновляют флаги N, Z, C и V в соответствии с результатом.
Помните: IT
позволяет от одного до четырех следующих команд Thumb (IT-блок) быть условным или вы можете сказать здесь. ITTE используется для обработки небольших последовательностей условного кода, до 4 инструкций.
Простые примеры
Пример 1:
cmp r1, #22 Compare r1 value with 22
IT EQ Read this as If EQual Then ADD R1,R1,#1
ADD R1,R1,#1 <- This will only be executed if above r1 value equal to 22(means when z condition flag is equal to 1)
Пример 2:
cmp r1, #22 Compare r1 value with 22
ITE EQ Read this as If EQual Then ADD R1,R1,#1 Else ADD R0,R0,#1
ADD R1,R1,#1 <- This will only be executed if the Z condition flag is 1
ADD R0,R0,#1 <- This will only be executed if the Z condition flag is 0
Что делает ITTE? ваш вопрос здесь
CMP R1, #22 Compare r1 value with 22
ITTE NE Read this as IF NotEqual Then ADD R1,R1,#1 Then ADD R0,R0,#1 Else ADD R2,R2,#1
ADD R1,R1,#1 <- This will only be executed if the Z condition flag is 0
ADD R0,R0,#1 <- This will only be executed if the Z condition flag is 0
ADD R2,R2,#1 <- This will only be executed if the Z condition flag is 1
Здесь ITTE
накладывает условие NE на первую две следующие инструкции и условие EQ на следующем.
ПРИМЕЧАНИЕ: Любые ветки, которые существуют в IT-блоке, должны быть последней инструкцией в блоке. Обратите внимание на здесь
Следующий пример будет иметь поведение undefined, потому что команда ветвления используется в середине инструкции перехода.
ite eq
blxeq some_label @ UNPREDICTABLE during an IT block.
movne r0, #0
Правильный способ реализации вышеизложенного состоял в том, чтобы поместить mov перед blx следующим образом:
ite ne
movne r0, #0
blxeq some_label @ Ok at the end of an IT block.
Для получения дополнительной информации Справочное руководство по набору инструкций THUMB-2 Страница 4-92
IT{x{y{z}}}<q> <Firstcondition>
<x>
условие для второй команды в IT-блоке
<y>
условие для третьей команды в ИТ-блоке
<z>
условие для четвертой команды в IT-блоке
<q>
указывает необязательные ассемблерные квалификаторы в инструкции
Два определителя, определенные здесь:
.N Meaning Narrow. Assembler has to choose 16-bit encoding for the instruction if it is not possible then error.
.W Meaning Wide. Assembler has to select 32-bit encoding for the instruction if is not possible then error.
<Firstcondition>
Условие для первой команды в IT-блоке i.e EQ, NE, CC, CS.
Ответ 4
Это часть семейства инструкций If-Then (что является единственным способом использования условного исполнения для кода Thumb-2)
Посмотрите эту ссылку:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cjabicci.html