android - 没有指令 stranih、lsreg、stream 的引用

标签 android assembly arm android-source

我正在查看 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/

相关文章:

android - native 类型的二进制表示是否保证在所有目标上都相同?

android - ViewPager - 无限滚动?

assembly - 如何确定是否应保留寄存器

java - 为 Google map 标记指定特定地址

assembly - 在汇编中编写 __attribute((constructor)) 函数 - 可以完成吗?

assembly - 为什么在 NASM 中使用 RIP 相对寻址?

c - 在 ARM macOS 上,当显式 raise() 信号时,某些返回地址在堆栈上会出现乱码

linker - ARM DCD 从 RAM 工作和执行

android - Google Drive api Android 下载谷歌文档文件

Android:不同型号的原始固件识别字符串