能力值:
( LV2,RANK:10 )
|
-
-
2 楼
c涨姿势了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
对新手很有帮助的说,THX。。。
|
能力值:
( LV9,RANK:370 )
|
-
-
4 楼
顶一个,,,
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
做个系列吧,系统的普及一下,造福人类!
|
能力值:
( LV3,RANK:30 )
|
-
-
6 楼
先做个Mark吧!
|
能力值:
(RANK:10 )
|
-
-
7 楼
顶一下,表示来学习的,
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
看到下面的解释:
/ 为6.做准备
// 必须对齐到(0,4,8,c),所以0x84ca变成0x84c8
4. r4 = [0x84a6+4+32] = [0x84ca] = [0x84c8] = 0xc26
这里有三个问题:
1 为什么 [0x84a6+4+32]会有+4呢?我发现主要有操作pc的就要+4,是因为要pc自动往后么?
2 所以0x84ca变成0x84c8,为什么不是0x84cc,我理解的是栈都是从高地址到低地址的原因,所以地址要往下,对么?
3 [0x84c8] 怎么变成0xc26,跟帖主说的thumb指令集有啥关系么?
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
[QUOTE=threewind;1201102]看到下面的解释:
/ 为6.做准备
// 必须对齐到(0,4,8,c),所以0x84ca变成0x84c8
4. r4 = [0x84a6+4+32] = [0x84ca] = [0x84c8] = 0xc26
这里有三个问题:
1 为什么 [0x84a6+4+32]会有+4呢?我发现主...[/QUOTE]
1 和arm的流水线有关,你只要记住arm指令pc+8,thumb指令pc+4
2 定义如此 #define ALIGN(x, y) ((y) * ((x)/(y)))
3 [0x84c8]减去基地址0x8000,就是0x4c8处的值,上面不是贴了图么
|
能力值:
( LV6,RANK:80 )
|
-
-
10 楼
[QUOTE=gemo;1201241]1 和arm的流水线有关,你只要记住arm指令pc+8,thumb指令pc+4
2 定义如此 #define ALIGN(x, y) ((y) * ((x)/(y)))
3 [0x84c8]减去基地址0x8000,就是0x4c8处的值,上面不是贴了图么[/QUOTE]
什么情况下+4呢,没有-4么,遵循四舍五入还是总是+4呢?
比如一个导出函数地址不是4的倍数,那它的真实地址一定+4或者+到满足4的倍数?
还有如果是thumb2指令集的话+多少?
按照macro来使:
ALIGN(addr,4) -> 4 * addr / 4?
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
我建议C基础不牢的先去认真学一下C,LS真的连ALIGN宏都看不懂么
|
能力值:
( LV6,RANK:80 )
|
-
-
12 楼
看来我2了。。。百度学习一下把。。。
|
能力值:
( LV8,RANK:120 )
|
-
-
13 楼
楼主,目前我有一个疑惑就是:你在第1、4、9条指令处读取的是一个字节的数据,但在第12条指令的时候读取的是4字节的数据。这是根据什么来判断的呢?难道是根据“该地址前or后的数据是否为0x00”?
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
都是读的4字节,了解数据在内存中的存储方式先
|
能力值:
( LV8,RANK:120 )
|
-
-
15 楼
哦,是我没注意,谢谢解答!
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
多谢楼主!涨姿势了!
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
通俗易懂,mark
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
学习了 mark!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
妈了 回去看
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
[QUOTE=threewind;1201102]看到下面的解释:
/ 为6.做准备
// 必须对齐到(0,4,8,c),所以0x84ca变成0x84c8
4. r4 = [0x84a6+4+32] = [0x84ca] = [0x84c8] = 0xc26
这里有三个问题:
1 为什么 [0x84a6+4+32]会有+4呢?我发现主...[/QUOTE]
第一个问题:因为是arm体系规定的,当读pc寄存器值时,如果是arm指令,则值为当前的PC值+8,当是thumb指令时,则读出的值是当前的PC值+4.
第二个问题:由于arm是32位的,在数据总线访问存储器时都是一次读取32位数据的,当访问地址不是对齐的时候,arm中叫做非对齐数据访问。此时arm会自动转换成对齐访问。在你的问题中,0x84ca地址中的数据是属于0x84c8,0x84c9,0x84ca,0x84cb四字中的数据,所以把0x84ca转换成0x84c8,一次性读取4字节,然后丢弃没用的数据。
第三个问题,[0x84c8]是存储器寻址方式,也就是说寻找存储器地址0x84c8处的数据。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
学习,谢谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
学习了,谢谢各位分享
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
学习了,谢谢分享
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
虽然时间久远,但是还是学习了 mark!
|
|
|