在书 <LINUX POWERPC详解:核心篇> 31页讲到: 本节内容对于程序员深入理解powerpc体系结构十分重要,
指令集,寄存器,及于编译器有关的ABI是处理器体系结构的精华所在。由于篇幅所限,本书不能详述。
看到最后语句傻眼了,还是不明白如何进行堆栈操作,如何单向链表,本地变量地址如何计算寻址,带入
参数如何传递, 既然是精华所在为何此处略去一千字...
shows the stack frame organization including all optional areas:
------------------------------------------------
| FPR Save Area |
| (optional, size varies) |
------------------------------------------------
| GPR Save Area |
| (optional, size varies) |
------------------------------------------------
| CR Save Word |
| (optional) |
------------------------------------------------
| Local Variables Area |
| (optional, size varies) |
------------------------------------------------
| Function Parameters Area |
| (optional, size varies) |
------------------------------------------------
| Padding to adjust size to multiple of 8 bytes |
| (optional, size varies 1-7 bytes) |
------------------------------------------------
| LR Save Word |
| Back Chain Word |
------------------------------------------------
. 调用前的堆栈 . . 调用后的堆栈 .
. . . .
| | | |
+----------------+- +----------------+-
| Parameter area | | | Parameter area | |
+----------------+ +-调用函数 +----------------+ +-调用函数
| Linkage area | | | Linkage area | |
SP --->+----------------+- +----------------+-
| 堆栈增长方向 | | Saved registers| |
. | . +----------------+ |
. v . | Local variables| |
+----------------+ +-被调函数
| Parameter area | |
+----------------+ |
| Linkage area | |
SP --->+----------------+-
| 堆栈增长方向 |
. | .
下面是简单的反汇编,似乎看的明白又不明白 :(
int average(int a, int b)
{
return (a + b) / 2;
}
int main(void)
{
int val = 0;
val = average(0xaa, 0x55);
return val;
}
10000480 <average>:
10000480: 7c 64 1a 14 add r3,r4,r3
10000484: 7c 63 0e 70 srawi r3,r3,1
10000488: 7c 63 01 94 addze r3,r3
1000048c: 4e 80 00 20 blr
10000490 <main>:
10000490: 94 21 ff f0 stwu r1,-16(r1) # -16(r1) = r1, r1 = -16(r1)
10000494: 7c 08 02 a6 mflr r0 # r0 = lr
10000498: 90 01 00 14 stw r0,20(r1) # 20(r1) = lr
1000049c: 38 60 00 aa li r3,170 # r3 = 0xaa
100004a0: 38 80 00 55 li r4,85 # r4 = 0xbb
100004a4: 4b ff ff dd bl 10000480 <average>
100004a8: 80 01 00 14 lwz r0,20(r1) # r0 = 20(r1)
100004ac: 7c 08 03 a6 mtlr r0 # lr = r0 恢复返回地址
100004b0: 38 21 00 10 addi r1,r1,16 # r1 += 16 恢复sp
100004b4: 4e 80 00 20 blr
问题:
1. 20(r1) = lr 其中 20 这个值始终不明白,在稍微长一点的函数里这个值会有所变化,如何计算它(在遵循EABI标准情况下)
2. r1(sp) 和 lr 什么时候需要保存以及恢复。
3. 在gdb里是否可以看到到整个链表。
3. 总结就是堆栈处理的单向链表如何看。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法