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