Подтвердить что ты не робот

Itte в сборе рук

Что делает следующая строка в сборке рук:

000031e6        2916    cmp r1, #22
000031e8        bf1a    itte    ne

Я получаю первую строку (сравнивая значения от r1 до 22), но что касается второй строки (я никогда не видел, чтобы команда itte раньше и googling ничего не возвращала)

4b9b3361

Ответ 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.