程序在调用子程序的时候为什么pc指针也要入栈?

[复制链接]
3137|4
 楼主| 想把我唱给你听 发表于 2014-11-1 20:21 | 显示全部楼层 |阅读模式
本帖最后由 想把我唱给你听 于 2014-11-1 20:27 编辑

比如说一个子程序:
void test(int a , int b)
{
    ..........
    ..........
}
反汇编后应该是:
mov     ip, sp                  //IP=SP;保存SP
stmdb   sp!, {fp, ip, lr, pc}   //先对SP减4,再对fp,ip,lr,pc压栈。
(这里的pc指针入栈后面没用到,如果不入栈可以吗?为什么?)
sub     fp, ip, #4      ; 0x4   //fp=ip-4;此时fp指向栈里面的“pc”

..........
..........(参数入栈)
..........(局部变量入栈)
..........
sub     sp, fp, #12     ; 0xc   //sp=fp-12;此时sp指向栈里面的lr
ldmia   sp, {fp, sp, pc}        //弹栈pc=lr,sp=ip,fp=fp。然后地址加4---------1

zchong 发表于 2014-11-2 18:48 | 显示全部楼层
好像没有必要PC入栈啊
ayb_ice 发表于 2014-11-3 14:05 | 显示全部楼层
中间调用了子程序就要入栈

再说这样入栈,返回时效率高
alphalovelife 发表于 2014-11-4 23:37 来自手机 | 显示全部楼层
本帖最后由 alphalovelife 于 2014-11-5 00:55 编辑

同求,貌似可以不入pc。
还有第二条sp减了16,倒数第二条sp指向"fp"?
麻烦死了 发表于 2016-4-17 15:48 | 显示全部楼层
同问啊,我也觉得奇怪,逻辑上也不对啊,入栈时四个,出栈时只三个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部