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,y和z是可选的,并且必须是T(对于"then")或E(对于"else"). <cond>是任何的条件,如NE或EQ或GT等,其反映在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标志),将进行减法.注意LT在SUB比赛中LT的IT指令.
一个完整的例子将是这样的:
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)
这应该足以让你咀嚼一段时间.
IT它似乎是( ) 指令系列的一部分if-then:http://infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf(第二页)。基本指令是IT,然后您必须T为“then”和E“else”给出==“不等于”ITTE的条件代码。NE