【发布时间】: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 #255 是 20ff,只有 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。