次の行はアーム アセンブリで何をしますか。
000031e6 2916 cmp r1, #22
000031e8 bf1a itte ne
最初の行を取得します (r1 と 22 を比較します) が、2 行目はどうですか (以前に itte コマンドを見たことがなく、グーグルで検索しても何も返されませんでした)
次の行はアーム アセンブリで何をしますか。
000031e6 2916 cmp r1, #22
000031e8 bf1a itte ne
最初の行を取得します (r1 と 22 を比較します) が、2 行目はどうですか (以前に itte コマンドを見たことがなく、グーグルで検索しても何も返されませんでした)
これは、Thumb-2 命令セットで導入された ARM の IF-THEN-ELSE 命令です。(上記の具体的な例に基づいて、指示に続く次の3つの指示を示していれば役に立ちましたITTE
。この回答を読み終わったら、その理由がわかります。)
この命令は、条件付きコードの小さなシーケンス (最大 4 つの命令) を処理するために使用されます。これは、ARM の条件付き実行を実装する別の方法と考えてください (たとえば、BNE - ゼロ フラグが設定されていない場合にのみ分岐命令が実行されます)。
その利点は、ブランチを取るというペナルティを回避できることです (おそらく、パイプラインなどについて学んでいるはずです)。
説明は少し複雑ですが、頭を包み込むと、かなりエレガントです。
次の形式を取ります。
IT<x><y><z><cond>
ここx
で、、、y
およびz
はオプションであり、T
("then" の場合) またはE
("else" の場合) のいずれかでなければなりません。 APSR フラグに反映される、またはまたは<cond>
などの条件のいずれかです。NE
EQ
GT
したがって、常に の後に 1 つT
ありI
(命令はIT
結局のところ!)、次に 0-3E
またはT
です。eachT
および eachE
に対して、一致する同じ順序で後続の命令が必要です。一致する後続の各命令には、IT
命令と一致する条件が必要です。
ご容赦ください。これが紛らわしいことは承知しています。ここでは、説明のためにいくつかの例を示します。
命令の最小形式は次のようになります。
IT LT
SUBLT.W R2, R1
この場合、LT
(APSR フラグに従って) が true の場合、減算が行われます。命令の と一致することに注意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」命令 (命令の後の 2 番目のIT
命令 - E は 4 つの E の 2 番目であり、 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 (2 ページ目)。基本的な命令はIT
and then であり、T
for "then" とE
for "else" を指定ITTE
し、条件コードNE
== "not equal" を指定します。
これは、If-Then 命令ファミリの一部です (Thumb-2 コードの条件付き実行を使用する唯一の方法です)。
このリンクをチェックしてください: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cjabicci.html