Итте в сборке руки - PullRequest
       86

Итте в сборке руки

16 голосов
/ 12 августа 2011

Что делает следующая строка при сборке кронштейна:

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

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

Ответы [ 4 ]

47 голосов
/ 13 августа 2011

Это инструкция ARM THEN-ELSE, представленная в наборе команд Thumb-2.(Исходя из вашего приведенного выше конкретного примера, было бы полезно, если бы вы показали следующие 3 инструкции, следующие за инструкцией ITTE, вы поймете, почему, когда закончили читать этот ответ.)

Эта инструкция используется для обработки небольших последовательностей условного кода, до 4 инструкций.Думайте об этом как о другом способе реализации условного выполнения ARM (например, BNE - инструкция ветвления выполняется, только если не установлен флаг нуля).

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

Инструкция немного сложна, но как только вы обернетесь вокруг нее, она будет довольно элегантной.

Она принимает форму:

IT<x><y><z><cond>

, где x, y и z являются необязательными и должны быть либо T (для «затем»), либо E (для »еще ").<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

Итак, мы имеемTHEN ELSE THEN (TETT), с условием NE.Обратите внимание на следующие 4 условных инструкции (4 инструкции, по 1 для TETT), инструкции THEN имеют условие NE и инструкцию ELSE (2-я инструкция после инструкции 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

Это должно дать вам достаточно времени, чтобы пережевать.

3 голосов
/ 20 декабря 2015

Проще говоря, ITTE выполняет следующие 3 выполнения, ЕСЛИ ТО {ТО, ЭТО {} ELSE {} на основе приведенной выше инструкции cmp.

В ARMv6T2 и более поздних архитектурах вы можете использовать IT Инструкция по условному исполнению.В архитектурах до ARMv6T2 нет инструкции IT, и поэтому инструкции Thumb не могут быть выполнены условно, за исключением инструкции ветвления B. Ассемблер проверяет инструкции IT, но опускает их при сборке в код ARM.

Для вашего решения давайте сначала разберемся в синтаксисе простой IT инструкции (введенной в Thumb 2) сборки ARM, которая является основой ITTE.

IT{pattern} {cond}

Если-то, устанавливает условия выполнения до 4-х следующих инструкций, может быть любая комбинация до трех T (тогда) и E (еще) букв, первая инструкция после IT всегда является cond (T) инструкциями, которые могут изменить программуСчетчик должен быть последним в блоке IT

Условия then должны соответствовать коду условия, а любые условия else должны быть противоположным условием. В таблице ниже приведены коды условий и их противоположности.:

enter image description here

Давайте разберемся с другой 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 для первых двух следующих инструкций и условие эквалайзера на следующую.

ПРИМЕЧАНИЕ: Любые ветви, которые существуют в IT-блоке, должны быть последней инструкцией в блоке. Ссылка взята из здесь Следующий пример будет иметь неопределенное поведение, потому что инструкция перехода используется в середине инструкции ветвления.

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> условие для третьей инструкции в IT-блоке

<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> условие для первого iИнструкция в IT-блоке, т. е. EQ, NE, CC, CS.

3 голосов
/ 12 августа 2011

Похоже на часть семейства команд IT (if-then): http://infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf (вторая страница).Базовая инструкция - IT, а затем у вас есть T для «тогда» и E для «еще», чтобы дать ITTE и код условия NE == «не равно».

1 голос
/ 12 августа 2011

Это часть семейства инструкций If-Then (это единственный способ использовать условное выполнение для кода Thumb-2)

Проверьте эту ссылку: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cjabicci.html

...