2

我正在查看路径 libc/arch-arm/bionic 的 android 平台中的 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

不仅这些说明在不同的文件中还有许多其他说明。

有谁知道这些说明是什么?

4

2 回答 2

1

第一条指令是来自 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 指令中的条件匹配,这种方法就可以很好地工作。正如我之前所说,这里不是这种情况,所以它要么不能在拇指模式、手臂模式或两者中工作:-)

于 2012-06-04T12:34:23.610 回答
0

strneh是一个带有一些条件执行/大小说明符后缀的存储命令。ARM 文档是一个很好的起点: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/ Chdehgih.html

如果您在 Google 上搜索“arm 条件执行”,您会发现许多可能也有帮助的博客/文章:http: //blogs.arm.com/software-enablement/258-condition-codes-2-conditional-execution/

至于你的 *strneh" 指令:

  • str = 商店
  • ne = 如果不相等则执行(Z 标志清除)
  • h = 执行半字操作
于 2012-06-04T12:37:15.250 回答