在手臂组装中

Joh*_*hon 18 embedded assembly arm instruction-set thumb

以下行在arm组件中做了什么:

000031e6        2916    cmp r1, #22
000031e8        bf1a    itte    ne
Run Code Online (Sandbox Code Playgroud)

我得到了第一行(比较r1到22)但是第二行怎么样(我之前从未见过itte命令而googling没有返回任何内容)

Dan*_*Dan 49

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

该指令用于处理小序列条件码,最多4条指令.可以将其视为实现ARM条件执行的另一种方式(例如BNE - 只有在未设置零标志时才执行分支指令).

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

该指令有点涉及但是一旦你绕过它,它就非常优雅.

它采取以下形式:

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

where x,yz是可选的,并且必须是T(对于"then")或E(对于"else"). <cond>是任何的条件,如NEEQGT等,其反映在APSR标记.

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

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

指令的最小形式如下:

IT LT
SUBLT.W  R2, R1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果LT为真(根据APSR标志),将进行减法.注意LTSUB比赛中LTIT指令.

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

ITETT NE
ADDNE R0, R0, R1
ADDEQ R0, R0, R3
ADDNE R2, R4, #1
MOVNE R5, R3
Run Code Online (Sandbox Code Playgroud)

所以我们那么那么那么(TETT),NE条件.请注意以下4个条件指令(4个指令,每个指令1个TETT),"THEN"指令NE有条件,"ELSE"指令(指令后的第2个IT指令 - 记住E是4个E的第2个和T's)具有相反的条件.它不可能是任何其他东西,即如果它是类似的LT而不是它将是一个错误EQ. EQ与...相反NE.

如果NE是,则执行指令1,3和4.否则(EQ),只ADDEQ执行指令2().

我给出了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;
}
Run Code Online (Sandbox Code Playgroud)

转换为

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
Run Code Online (Sandbox Code Playgroud)

这应该足以让你咀嚼一段时间.

  • 很好的概述.对于可能不熟悉ARM的读者而言有一些背景知识:32位ARM操作码每个都有条件位来控制操作码是否应该执行.在开发原始Thumb变体时,16位操作码中没有空间专用于条件执行位,因此只有分支操作码具有条件执行(与许多其他CPU一样).Thumb2添加了这些'条件操作码'以允许短序列的条件执行(即,防止短条件代码序列杀死管道). (5认同)

Pau*_*l R 3

IT它似乎是( ) 指令系列的一部分if-thenhttp://infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf(第二页)。基本指令是IT,然后您必须T为“then”和E“else”给出==“不等于”ITTE的条件代码。NE