我在调试一些C++代码(在ARM平台上使用WinCE 6),发现了一些奇怪的行为:
4277220C mov r3, #0x93, 30
42772210 str r3, [sp]
42772214 ldr r3, [pc, #0x69C]
42772218 ldr r2, [pc, #0x694]
4277221C mov r1, #0
42772220 ldr r0, [pc, #0x688]
代码中的42772214 ldr r3, [pc, #0x69C]
这一行用来从.DATA节获取一些常量,至少我是这么认为的。
奇怪的是,根据代码,r2应该填充地址为 pc=0x42772214 + 0x69C = 0x427728B0 的内存,但据内存内容显示,它是从0x427728B8(+8字节)加载的,其他ldr使用也会发生同样的情况。
这是调试器的错误还是我的ldr/pc理解有误呢?另外一个问题是:为什么访问.data部分与执行的代码相关呢?我觉得有点奇怪。
还有一个问题:我找不到第一个mov命令的语法(任何人都可以指向我Thumb(1C2)的操作类型规范吗?)
抱歉我的描述比较初级,但我正在熟悉汇编语言。
thumb
代码,而更像是ARM
代码。所有指令的地址相差4个字节 - 只有少数几个4字节的thumb
指令。 - Aidan Cully