以下行在手臂装配中做了什么:
000031e6 2916 cmp r1, #22
000031e8 bf1a itte ne
我得到了第一行(将 r1 与 22 进行比较),但第二行呢(我以前从未见过 itte 命令,谷歌搜索什么也没返回)
以下行在手臂装配中做了什么:
000031e6 2916 cmp r1, #22
000031e8 bf1a itte ne
我得到了第一行(将 r1 与 22 进行比较),但第二行呢(我以前从未见过 itte 命令,谷歌搜索什么也没返回)
它是 ARM 的 IF-THEN-ELSE 指令,它是在 Thumb-2 指令集中引入的。(根据您上面的具体示例,如果您在说明之后显示了接下来的 3 条说明,那将会很有帮助ITTE
,当您阅读完此答案后,您就会明白为什么。)
该指令用于处理小序列的条件代码,最多 4 条指令。将其视为实现 ARM 条件执行的不同方式(例如 BNE - 仅在未设置零标志时才执行分支指令)。
它的好处是它避免了使用分支的惩罚(大概你已经了解了管道等)
该指令有点复杂,但是一旦您将头绕在它周围,它就会非常优雅。
它采用以下形式:
IT<x><y><z><cond>
其中x
、y
和z
是可选的,并且必须是T
(对于“then”)或E
(对于“else”)。 <cond>
是反映在 APSR 标志中的任何条件,例如NE
orEQ
或GT
等。
所以你总是有一个T
跟随I
(指令IT
毕竟是!),然后是 0-3E
或T
's。对于 eachT
和 each E
,您必须有一个与匹配顺序相同的后续指令。每个匹配的后续指令必须具有与该IT
指令匹配的条件。
忍受我,我知道这很令人困惑。我将在这里举几个例子来说明。
指令的最小形式是这样的:
IT LT
SUBLT.W R2, R1
在这种情况下,如果LT
为真(根据 APSR 标志),则会发生减法。注意指令中LT
的SUB
匹配。LT
IT
一个完整的例子是这样的:
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
这应该给你足够的时间咀嚼。
它似乎属于IT
( if-then
) 指令系列:http: //infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf(第二页)。基本指令是IT
,然后你有T
“then”和E
“else”给出ITTE
和NE
==“不等于”的条件代码。
简而言之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。
它是 If-Then 指令系列的一部分(这是对 Thumb-2 代码使用条件执行的唯一方法)
查看此链接: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/ Cjabicci.html