我正在查看 android 平台中路径 libc/arch-arm/bionic 中的 strcpy.S 文件,该文件中有许多我无法理解的 arm 指令,我还引用了 ARM 系统开发人员指南。 这里除了“tst”和“tstne”我无法在任何书籍或 ARM 引用手册中找到其他人的任何引用。
tst r2, #0xff00
iteet ne
strneh r2, [ip], #2
lsreq r2, r2, #8
r2, [ip]
tstne r2, #0xff
不仅这些说明,不同文件中还有许多其他说明。
有人知道这些说明是什么吗?
最佳答案
第一条指令是 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 指令的条件与其他三个指令的条件相互冲突。这是代码中的错误。很可能它以前没有被发现,因为代码 fragment 来自 ARM-big-endian 代码,而且我知道没有 android 手机在 big-endian 中使用 ARM。
顺便说一句,了解为什么在 it 指令和指令本身中给出条件是值得的。这是统一 ARM assembly 标准的一部分。在 ARM 上有两种操作模式:Thumb 模式(使用 It 指令,功能较弱)和 ARM 模式(功能更强大,在指令本身中使用条件标志)。
如果您将自己局限于 thumb 模式的功能,则可以编写可在 thumb 和 ARM 模式下编译的代码。这是在这里完成的。
如果您针对 Thumb 模式进行汇编,则 It 指令将用于控制下三个指令的条件,指令中的条件将被忽略。如果您汇编为 ARM 指令集,则 It 指令将被忽略,指令本身的条件将变为 Activity 状态。
只要 it 指令和 arm 指令中的条件匹配,这就可以正常工作。正如我之前所说,这里不是这种情况,因此它要么不能在拇指模式、 ARM 模式或两者都工作:-)
关于android - 没有指令 stranih、lsreg、stream 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879999/