18

以下行在手臂装配中做了什么:

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

我得到了第一行(将 r1 与 22 进行比较),但第二行呢(我以前从未见过 itte 命令,谷歌搜索什么也没返回)

4

4 回答 4

50

它是 ARM 的 IF-THEN-ELSE 指令,它是在 Thumb-2 指令集中引入的。(根据您上面的具体示例,如果您在说明之后显示了接下来的 3 条说明,那将会很有帮助ITTE,当您阅读完此答案后,您就会明白为什么。)

该指令用于处理小序列的条件代码,最多 4 条指令。将其视为实现 ARM 条件执行的不同方式(例如 BNE - 仅在未设置零标志时才执行分支指令)。

它的好处是它避免了使用分支的惩罚(大概你已经了解了管道等)

该指令有点复杂,但是一旦您将头绕在它周围,它就会非常优雅。

它采用以下形式:

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

其中xyz是可选的,并且必须是T(对于“then”)或E(对于“else”)。 <cond>是反映在 APSR 标志中的任何条件,例如NEorEQGT等。

所以你总是有一个T跟随I(指令IT毕竟是!),然后是 0-3ET's。对于 eachT和 each E,您必须有一个与匹配顺序相同的后续指令。每个匹配的后续指令必须具有与该IT指令匹配的条件。

忍受我,我知道这很令人困惑。我将在这里举几个例子来说明。

指令的最小形式是这样的:

IT LT
SUBLT.W  R2, R1

在这种情况下,如果LT为真(根据 APSR 标志),则会发生减法。注意指令中LTSUB匹配。LTIT

一个完整的例子是这样的:

ITETT NE
ADDNE R0, R0, R1
ADDEQ R0, R0, R3
ADDNE R2, R4, #1
MOVNE R5, R3

所以我们有条件有条件的 THEN ELSE THEN THEN ( TETT) NE。请注意,在随后的 4 条条件指令中(4 条指令,每条 1条TETT),“THEN”指令NE有条件,“ELSE”指令(指令之后的第二IT条指令 - 记住 E 是 4 个 E 中的第二个,并且T's) 具有相反的条件。它不能是其他任何东西,即如果它是类似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

这应该给你足够的时间咀嚼。

于 2011-08-13T13:56:58.870 回答
3

它似乎属于IT( if-then) 指令系列:http: //infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf(第二页)。基本指令是IT,然后你有T“then”和E“else”给出ITTENE==“不等于”的条件代码。

于 2011-08-12T15:24:36.097 回答
3

简而言之ITTE,根据上述cmp指令执行以下 3 次执行,如 IF THEN {} THEN {} ELSE {}。

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

对于您的解决方案,让我们首先了解 ARM 程序集的简单IT指令(在 Thumb 2 中介绍)的语法,它是ITTE.

IT{pattern} {cond}

if-then,设置后面最多4条指令的执行条件可以是最多三个T(then)和E(else)字母的任意组合,IT后面的第一条指令总是cond(T)可以修改程序的指令计数器必须在 IT 块中的最后一个

条件必须与条件码相匹配,then任何else条件都必须是相反的条件。下表显示了条件码及其反义词:

在此处输入图像描述

让我们理解另一个cmp指令。

CMP Rn, #imm

Rn 必须是 Lo 寄存器。imm 范围 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 块中存在的任何分支都必须是块中的最后一条指令。从此处引用 以下示例将具有未定义的行为,因为分支指令用于分支指令的中间。

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>IT 块中第一条指令的条件,即 EQ、NE、CC、CS。

于 2015-12-20T14:54:33.323 回答
1

它是 If-Then 指令系列的一部分(这是对 Thumb-2 代码使用条件执行的唯一方法)

查看此链接: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/ Cjabicci.html

于 2011-08-12T15:29:02.623 回答