【问题标题】:ARM and AndroidARM 和安卓
【发布时间】:2014-05-26 11:28:45
【问题描述】:

所以,我对 ARM 指令一无所知,只是刚刚开始尝试理解它。我在 ARM 上查了一下,其中一些更好的链接是:

Converting very simple ARM instructions to binary/hex

http://simplemachines.it/doc/arm_inst.pdf

根据第一个链接,指令具有以下格式并且是32位:

[cond][00][immediate][opcode][alerts condition codes?][Rn][Rd][Operand 2]

但是,当我反汇编一些 .so 文件时,我发现大多数其中一些指令是 16 位的并且格式不同。

为什么会出现差异?有没有规范。为了这? 一个例子是它如何编码 mov

一个简单的 mov r0 #25520ff,只有 16 位而不是 32 位。奇怪(对我来说)。


据我了解,您通常不能在一条指令中指定完整的 32 位值。我不知道汇编程序编译的语法。

我一直在做的是使用十六进制编辑器编辑现有的 .so 文件。并运行它们。

我尝试AND两个值,但做不到,例如:

mov r0 #63 ;0x003f
mov r1 #16896 ;0x4200

and r0, r0, r1, lsl #8 ;should be 0x423f at this point
mov r15,  r14 ;method returns at this point, right?

除了,我没有汇编器,必须这样做:

  • 在反汇编的 .so 文件中查找返回 int 的方法
  • 覆盖条目
  • 运行并查看输出

所以,这就是我得到的:

mov r0 0x003f - 1110 00 1 1101 0 0000 0000 0000 00111111 - e3a0 003f

mov r1 0x0042 - 1110 00 1 1101 0 0000 0001 0000 01000010 - e3a0 1042

and r0, r0, r1, lsl #8 - 1110 00 0 0000 0 0000 0000 00001000 0001 - e000 0081

mov r15, r14 - 1110 00 0 1101 0 0000 1111 0000 0000 1110 - e1a0f00e

所以.. 是的,我考虑了指令,使用表格对其进行编码,使用计算器将其转换为十六进制,使用十六进制编辑器,传输到我的手机并运行应用程序..

当调用该方法时,我一直得到一个。我在这里遗漏了什么吗?

所以.. 是的。

为什么 android 的 ARM 似乎有 16 位指令和 32 位指令混合,为什么我的小尝试不起作用?

【问题讨论】:

  • “我没有汇编程序”。获取 Android NDK。

标签: android assembly


【解决方案1】:

请注意,当您说“ARM 指令”时,它不仅仅是一个指令集,而是多种指令集,具体取决于架构和支持的扩展。您链接到的文档首先提到了架构 v4,如果您查看您最喜欢的 wiki 中的“ARM 架构”,它会指出 v4 是“遗留”架构。

Android 本身开始支持 ARMv6,大多数现代设备都运行 ARMv7 或 ARMv7a。虽然我不确定我会认为 16 位指令是 Thumb2,而不是最初的 Thumb 扩展,它旨在提高代码密度,因为 ARM 为 10 到 20 年前的嵌入式市场设计了兆字节很多内存。

如果您正在学习,我会参考 ARM 在其网站上提供的文档: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406b/index.html

并可能查看来自 gcc 的 ARM 指令:

http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html

并为 ARM 设置获取交叉编译器,以便您可以采用 C 等高级语言并生成 ARM 二进制文件。

【讨论】:

  • 感谢您的帮助 =) 我使用 Thumb2 让它工作了。我猜你不能将 ARM 和 Thumb 混合在同一个“分支”或其他任何名称中。
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2012-01-22
  • 2011-05-17
  • 2011-03-08
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多