首页
社区
课程
招聘
[求助]关于ARM程序中字符串的偏移量。。。。。
2009-7-10 13:00 7205

[求助]关于ARM程序中字符串的偏移量。。。。。

2009-7-10 13:00
7205
先看图:






从图中看到指令为:

.text:00071964                 LDR     R1, =s->Www_

=s->Www_字符串的实际位置在:  00108DDC

指令的机器码为: 78 11 9F E5

E5 9F  是 LDR       11 78 为偏移值,,,,


现在的问题是:  这个 11 78 是怎样计算出来的,,有人知道吗???

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 12 2009-7-10 13:46
2
0
这和ARM处理器的寻址方式有关。字符串一般放在文字池中。

ldr指令中装载的地址是字符串在文字池中的地址相对于当前PC中地址的偏移量。
雪    币: 2604
活跃值: (64)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
加百力 12 2009-7-10 13:49
3
0
这个问题问的很好!

因为RISC架构的处理器指令长度固定,所以在寻址的时候经常使用相对距离以节约表示地址的长度。

例如:ARM中的跳转指令,跳转的地址也是相对于当前PC的。
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
maxiu 2009-7-10 15:25
4
0
这个不复杂,楼主的截图没有把关键的地方抓到,
嘻嘻,有空偶写个这方面的东东
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Kisco 2009-7-10 18:14
5
0

我是想替换掉程序中的一个字符串,,但太长了,,只好找一个空白的地方写入,,然后用 ldr 载入这个这符串,,就是不清楚它的偏移量怎么算,,,真晕,,,




希望加百力版主和楼上的 maxiu 帮帮忙,,谢谢。。。

另外,,有些地方的机器码这样的: 78 10 9F E5

E5 9F  为 LDR   ,, 10 为寄存器 R1  ,,78  才为字符串的偏移量,,,,

..

..
雪    币: 276
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kwzlj 2009-7-14 12:43
6
0
我反编译一个看看再回复你。
雪    币: 276
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kwzlj 2009-7-14 13:15
7
0
不太懂编程,不知道我描述的对不对,因为每条ARM指令占用四个字节,通常ARM程序的字符串的存放规则是这样的,在子程序后面通常会存放着很多调用字符串的指针位置,这个指针所指向的地址就是真正的字符串位置,按楼主的图我给你说明一下,在第二个图的OFF_39EA4双击就到了这个指针的位置,你可以查看它的十六进制值,里面的值所指向的就是真正的字符串位置,此时记下它的地址即目标地址,图中调用的地方是71964,即当前地址,看计算方法:(目标地址-当前地址-8)=未知-71964-8=1178,-8的意思是因为两条指令占用了2*4,修改时,程序调用的地方可以不用改,还是1178,直接修改指针指向字符串新地址就可以了。
雪    币: 276
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kwzlj 2009-7-14 13:16
8
0
唉,俺也不知道说明白没有。
雪    币: 195
活跃值: (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
vxworks 1 2009-7-14 20:41
9
0
E59F1178 ===> LDR R1, [PC, #0x178]

即用 PC 指针作为基址寄存器寻址,从 PC + 8 + 0x0178 的地址加载数据到 R1 中
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Kisco 2009-7-17 12:44
10
0
谢谢各位的帮助,,刚从外地回来,,打开电脑直奔pediy,,看到有人帮忙了,,真开心,,,谢谢。。。。
游客
登录 | 注册 方可回帖
返回