导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→FROM QORSE

感谢回帖!
需要说明的是,KE


* 46790: Keilc高手请指导: 下面是KeilC编译器错误,或者是我理解错误?

   guest 
guest发表的帖子 

 
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

  
回复该帖

本主题共有 4 帖,分页:>>>>>该主题的所有内容[4]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  46791.[详细]更正说明错误:1. 局部变量不放在外部堆栈中2.xbp是局部变量的地址,而外部堆栈指针存..
摘要:更正说明错误: 1. 局部变量不放在外部堆栈中 2.xbp是局部变量的地址,而外部堆栈指针存放在BANK0:R6R7  但是程序结尾的 先缩回外部堆栈再取出返回地址放置到sp,应该......(167字)
- [guest][1016次] 2003年12月26日

[上一篇帖子]:更正说明错误: 1. 局部变量不放在外部堆栈中 2.xbp是局部变量的地址
[下一篇帖子]:哪里能找到keil c166 无限制版?哪里能找到keil c166&