【发布时间】:2019-12-26 23:38:59
【问题描述】:
我正在尝试获取拇指组件中标签的地址,但遇到了一些问题。
我已经阅读了this post,但这对我没有帮助,我会解释原因。
我正在用 Thumb 程序集编写一个简单的程序(不幸的是我不能使用 Thumb2)。
让我们考虑这段代码:
.arch armv5te .syntax unified .text .thumb .thumb_func thumbnow: 0x0 PUSH {LR} 0x2 LDR R0, =loadValues 0x4 POP {PC} .align loadValues: 0x8 .word 0xdeadbee1 0xC .word 0xdeadbee2 0x10 .word 0xdeadbee3
我正在使用 arm-linux-gnueabi 工具链来组装它。
我的微控制器没有 MMU,所以内存地址是静态的,没有虚拟页面等。
我想要做的事情是让 R0 的值在此处为 0x8,这样我就可以像这样访问三个单词:
LDR R1, [R0] LDR R2, [R0,#4] LDR R3, [R0,#8]
这在 LDR 中是不可能的,因为字中的值不可能适合 MOV 命令。汇编器的文档指出,如果该值不能适合 MOV 命令,那么它将将该值放入文字池中。
所以我的问题是,如果地址的内容不适合 MOV 命令,是否可以在 Thumb 程序集中获取标签的实际地址?
【问题讨论】:
-
是的,你让工具把它放在附近的水池里,它就可以到达那里。 gnu 汇编器会将 ldr 转换为 pc 相对负载。它不是为你做的吗?
-
它确实适用于文字池,但我的问题(主要出于好奇)是是否有可能实际获取实际数据的地址,而不是文字池实例的地址。
-
与固定长度指令集中的任何立即数一样,您在有效位的数量方面受到限制。 arm、mips、risc-v 等 thumb 和 16 位 mips(和 16 位 risc-v)指令会进一步限制您,所以一般不会。它不适用于所有情况。这种愿望的另一个问题是地址是在组装期间而不是在链接时间确定的,因此可以说他们可以为相对于 pc 的加载进行编码,然后放弃该常数并在链接时使其成为相对于 pc 的添加。但没有,也许那是语言问题(目标的每种汇编语言都特定于工具)
-
如果你在gnu assembler for arm上使用ldr,如果它知道当时的值并且合适的话,它可以使它成为mov。人们希望它也能将 ldr 切换为 adr 伪指令的等效项,但没有。一个实验是将 adr 与不适合的立即数一起使用,看看汇编器是否失败,或者将其转换为 ldr 加 add 或其他东西。
标签: gcc assembly arm reverse-engineering thumb