首页
社区
课程
招聘
[求助]arm汇编几种格式的语句看不懂
发表于: 2016-5-31 11:21 6718

[求助]arm汇编几种格式的语句看不懂

2016-5-31 11:21
6718
最近研究了下arm汇编,主要侧重arm和thumb汇编指令的编码,看arm手册上说LDR相关的指令格式大概是这样的:
31~28|  27~26        | 25 24 23 22 21 20|        19~16        |         15~12        |        11~0
cond          |     01        |   I    P  U  B   W  L|        Rn                |        Rd                |        Op2

也就是说立即数不能超过12位。但是我用ida打开so文件的时候经常看到以下这样的代码:
.text:0000D618                 LDR             R4, =(_GLOBAL_OFFSET_TABLE_ - 0xD624)
.text:0000D61C                 ADD             R4, PC, R4 ; _GLOBAL_OFFSET_TABLE_
对应的二进制是:
DC 44 9F E5 04 40 8F E0

我知道是因为PIC才产生这样的代码,但是对照arm手册上的LDR指令格式却对照不上,而且_GLOBAL_OFFSET_TABLE_是在文件的末尾,数很大,减去0xD624得到的相对偏移超过12位了。

请问这是为什么?应该怎么去对照二进制和汇编代码?多谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
去DCD里面去找数据,然后根据DCD里面的内容定位在data当中的位置
2016-5-31 14:05
0
雪    币: 15
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个我明白,我是不明白二进制的指令怎么和汇编指令对照,_GLOBAL_OFFSET_TABLE_和0xD624都超过12位了,ida是怎么根据DC 44 9F E5这32位解码出来 LDR             R4, =(_GLOBAL_OFFSET_TABLE_ - 0xD624)这条指令的?
2016-5-31 15:02
0
雪    币: 7016
活跃值: (4232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
它的真正指令是样的:
ldr r4, [pc, 0x4dc]  <==这里没到12位, 不要只看_GLOBAL_OFFSET_TABLE_和0xD624的值, 它们两个是相减的, 差肯定没有超过12位
add r4, pc, r4
2016-5-31 19:00
0
雪    币: 803
活跃值: (850)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
后面的数据是一个地址,这个数据被放在文字池里面
2016-6-1 06:23
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
看手册。机器码计算方式 imm8 >> 2 + current address + size of next instruction
2016-6-1 09:44
0
雪    币: 15
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=MaYil;1431682]它的真正指令是样的:
ldr r4, [pc, 0x4dc]  <==这里没到12位, 不要只看_GLOBAL_OFFSET_TABLE_和0xD624的值, 它们两个是相减的, 差肯定没有超过12位
add r4, pc, r4...[/QUOTE]

就我这边的文件来看的话
.text:0000D618                 LDR             R4, =(_GLOBAL_OFFSET_TABLE_ - 0xD624)
这条指令,_GLOBAL_OFFSET_TABLE_的地址是:
.got:0004CED0 _GLOBAL_OFFSET_TABLE_ DCD 0             ; DATA XREF: .plt:00009180o

按照二进制DC 44 9F E5来解析的话,命令应该是ldr r4, [pc, 0x4dc],
但ida是怎么解析成(_GLOBAL_OFFSET_TABLE_ - 0xD624)这样的?
这就是我不明白的地方
多谢!
2016-6-1 11:08
0
雪    币: 188
活跃值: (167)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
是   imm8 >> 2 + current address + size of next instruction
2016-6-1 11:13
0
雪    币: 15
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=MaYil;1431682]它的真正指令是样的:
ldr r4, [pc, 0x4dc]  <==这里没到12位, 不要只看_GLOBAL_OFFSET_TABLE_和0xD624的值, 它们两个是相减的, 差肯定没有超过12位
add r4, pc, r4...[/QUOTE]

明白了,[pc, 0x4dc]得到的地址是0xDAFC,这个地址的内容是:
.text:0000DAFC off_DAFC        DCD _GLOBAL_OFFSET_TABLE_ - 0xD624
ida应该是根据这个解析得到的LDR             R4, =(_GLOBAL_OFFSET_TABLE_ - 0xD624)
多谢解答
2016-6-1 11:48
0
游客
登录 | 注册 方可回帖
返回
//