在ARM汇编中,ITTE是什么意思?

19

以下的ARM汇编语句是什么意思:

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

我知道如何得到第一行(将r1与22进行比较),但第二行不清楚(我从未见过itte命令,谷歌搜索也没有返回结果)

4个回答

55
这是ARM的IF-THEN-ELSE指令,引入了Thumb-2指令集。(根据你上面的具体示例,如果你展示了ITTE指令后面的下3条指令,那么阅读完这篇答案后你就会明白为什么这很有帮助。)
该指令用于处理小的条件代码序列,最多包含4条指令。可以将其视为实现ARM条件执行的另一种方式(例如BNE-只有在未设置零标志位时才执行分支指令)。
好处是避免了分支带来的惩罚(假设您已经了解了流水线等)。
该指令有点复杂,但一旦理解了它,就会觉得非常优雅。
其形式为: IT<x><y><z><cond> 其中, 和是可选的,并且必须是T(表示"then")或E(表示"else")。 是反映在APSR标志中的任何条件,如NE、EQ或GT等。
因此,您始终需要一个跟随I后面的T(毕竟指令是IT!),然后是0-3个E或T。对于每个T和每个E,您必须有一个与之匹配的后续指令,顺序相同。每个匹配的后续指令必须具有与IT指令匹配的条件。
请耐心阅读,我知道这很令人困惑。我将在这里给出几个示例以说明。
该指令的最小形式可能是以下内容:
IT LT
SUBLT.W  R2, R1

在这种情况下,如果APSR标志位中的LT为真,将进行减法运算。请注意SUB中的LTIT指令中的LT相匹配。
一个完整的示例可能如下所示:
ITETT NE
ADDNE R0, R0, R1
ADDEQ R0, R0, R3
ADDNE R2, R4, #1
MOVNE R5, R3

因此,我们有THEN ELSE THEN THEN(TETT),带有NE条件。请注意,在接下来的4个条件指令中(每个TETT一个指令),“THEN”指令具有NE条件,“ELSE”指令(在IT指令之后的第二条指令 - 记住E是4个E和T中的第二个)具有相反的条件。它不能是其他任何东西,即如果它是LT而不是EQ,那么就会出现错误。EQ是NE的相反。

因此,如果NE为true,则将执行指令1、3和4。否则(EQ),只执行指令2(ADDEQ)。

我已经给出了1和4指令的示例,但您也可以使用2(ITT)和3指令(ITTET)形式。

最后,为了说明这一点,我将举一个实现以下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

这应该能让你有足够的东西消化一段时间了。


5
很好的概述。以下是一些背景信息,以便那些可能对ARM不太熟悉的读者了解:32位ARM操作码每个都有条件位来控制操作码是否应该执行。当最初开发Thumb变体时,在16位操作码中没有空间用于专门用于条件执行位,因此只有分支操作码具有条件执行功能(就像许多其他CPU一样)。Thumb2添加了这些“条件操作码”,以允许短序列的条件执行(即防止短的条件代码序列破坏流水线)。 - Michael Burr
很好的解释!但是如果我想在条件块中获得更多指令(不限于4个),该怎么办?唯一的方法是使用分支吗? - cifer

4

简单来说,ITTE 根据上面的 cmp 指令执行以下 3 种情况:IF THEN {} THEN {} ELSE {}。

在 ARMv6T2 及更高版本的架构中,可以使用 IT 指令进行条件执行。在 ARMv6T2 之前的架构中,没有 IT 指令,因此除了 B 分支指令外,Thumb 指令不能被有条件地执行。汇编器会检查 IT 指令,但在汇编为 ARM 代码时省略它们。

为了解决问题,让我们先了解 ARM 汇编中简单的 IT 指令的语法(引入于 Thumb 2),这是 ITTE 的基础。

IT{pattern} {cond}

If-then,为接下来的最多 4 条指令设置执行条件,可以是最多三个 T(then)和 E(else)字母的任意组合,紧随 IT 的第一条指令始终是 cond (T)。修改程序计数器的指令必须是 IT 块中的最后一条指令。

Then 条件必须匹配条件码,而任何 else 条件必须是相反的条件。下表显示了条件码及其相反条件:

enter image description here

让我们了解另一个cmp指令。 CMP Rn,#imm Rn必须是Lo寄存器。 imm范围为0-255。 这些指令根据结果更新N,Z,C和V标志。
记住:IT允许对接下来的一个到四条Thumb指令(IT块)进行条件处理,或者在这里可以使用ITTE来处理最多4条指令的小序列。 简单例子
Ex 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块中的分支必须是块中的最后一条指令。参考自此处。 以下示例将会产生未定义行为,因为在分支指令中途使用了分支指令。

ite     eq  
blxeq   some_label  @ UNPREDICTABLE during an IT block.  
movne   r0, #0  

正确的实现方式是在blx之前放置mov,如下所示:
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>

在IT块中第二条指令的条件为<x>,第三条指令的条件为<y>,第四条指令的条件为<z>。指令上的可选汇编限定符由<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.
< p > <Firstcondition> 是IT块中第一条指令的条件,例如EQ、NE、CC、CS。


3

1

好的,那么这些指令实际上在说什么? - Johnathon
如果你懂一些日语,那句话非常适合 :) - Jens Björnhager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接