FROM QORSE
感谢回帖!
需要说明的是,KEILC提供了返回地址在外部堆栈的方式,目的在于将返回地址放置到外部堆栈即XBP位置以节省硬件堆栈资源.但是按照它的生成代码方式,只有没有参数的函数才可以使用这种方式而不出错误.
现在的编译方式生成代码的顺序:
1. 调用前,加大XBP以传递函数参数(如果参数长度为Len1,则XBP - Len1)
2.CALL: 存PC返回地址到SP,SP+2,进入函数
3.将XBP大小加大2,以存放返回地址.并将返回地址移到XBP,然后SP-2
4.如果该函数有局部变量,则增加XBP以提供局部变量(如果局部变量长度为Len2则XBP - Len2).
4.进行函数过程......
5.一次缩回XBP,准备退出(如果有参数也一次缩回XBP即XBP + Len1 + Len2),问题就在这里)
6.取回返回地址,放置到sp,使SP+2, 再缩回XBP,即XBP-2(XBP是对了,但是sp中错了)
所以C51.PDF帮助文档的P75的程序不会出问题!因为Len1=Len2=0!!!
按照一般的编译原则,或许下面的过程比较合理一些:
1. 调用前,加大XBP以传递函数参数(如果参数长度为Len1,则XBP - Len1)
2.CALL: 存PC返回地址到SP,SP+2,进入函数
3.将XBP大小加大2,以存放返回地址.并将返回地址移到XBP,然后SP-2
4.进行函数过程......
5.缩回XBP(XBP + Len2)
6.取出返回地址并放到SP,SP+2,然后缩回到XBP+2
7.缩回XBP(XBP + Len1)
8.RET
发表时间:2003年12月25日23:40:11