第一条指令是来自 thumb 指令集的 it 指令。
iteet ne
该指令将接下来的三个指令标记为有条件可执行。指令的最后三个字符构成一个由 e (else) 或 t (then) 组成的模式。操作数 'ne' 指定要评估的条件。
其他三个指令是带有条件的普通 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 指令影响的三个指令。它们也带有 ne/eq 条件标志。
如您所见,it 指令的条件与其他三个指令的条件相互冲突。这是代码中的一个错误。很可能以前没有发现它,因为代码片段来自 ARM-big-endian 代码,而且我知道没有在 big endian 中使用 ARM 的 android 手机。
顺便说一句,了解为什么在 it 指令和指令本身中给出条件是值得的。这是统一臂组件标准的一部分。在 ARM 上,您有两种操作模式:Thumb 模式(使用 It 指令,功能较弱)和 ARM 模式(功能更强大,在指令本身中使用条件标志)。
如果您将自己限制在 thumb 模式的功能上,则可以编写在 thumb 和 ARM 模式下编译的代码。这是在这里完成的。
如果为 Thumb 模式汇编,It 指令将用于控制下三个指令的条件,指令中的条件将被忽略。如果汇编为 ARM 指令集,It 指令将被忽略,指令本身的条件将变为活动状态。
只要 it 指令和 arm 指令中的条件匹配,这种方法就可以很好地工作。正如我之前所说,这里不是这种情况,所以它要么不能在拇指模式、手臂模式或两者中工作:-)