最初の指示はそれです-親指の指示セットからの指示。
iteet ne
この命令は、次の3つの命令を条件付き実行可能としてマークします。命令の最後の3文字は、e(else)またはt(then)で構成されるパターンを作成します。オペランド'ne'は、評価される条件を指定します。
他の3つの命令は、条件付きの通常のARM命令です。
strneh r2, [ip], #2 ; store halfword if not equal
lsreq r2, r2, #8 ; logical shift right if equal
tstne r2, #0xff ; test if not equal
これらは、it-instructionの影響を受ける3つの命令です。ne/eq条件付きフラグも付属しています。
ご覧のとおり、it-命令の条件と他の3つの命令の条件は互いに矛盾しています。これはコードのバグです。コードスニペットはARMビッグエンディアンコードからのものであり、ビッグエンディアンでARMを使用するAndroidスマートフォンはないため、これまでに発見されたことがない可能性があります。
ところで、条件がit-命令と命令自体に示されている理由を知ることは価値があります。これは、統合アームアセンブリ標準の一部です。ARMには、2つの操作モードがあります。Thumbモード(It命令を使用し、強力ではありません)とARMモード(より強力で、命令自体に条件フラグを使用します)です。
サムモードの機能に制限すると、サムモードとARMモードでコンパイルされるコードを記述できます。これはここで行われます。
Thumbモード用にアセンブルすると、It命令が次の3つの命令の条件を制御するために使用され、命令内の条件は無視されます。ARM命令セットにアセンブルすると、It命令は無視され、命令自体の条件がアクティブになります。
これは、it命令とarm命令の条件が一致している限りうまく機能します。前に言ったように、これはここでは当てはまらないので、サムモード、アームモード、またはその両方で機能しません:-)