Keil 编译器关于51压栈和弹栈问题?诡异!Keil的Bug?

[复制链接]
 楼主| li460135301 发表于 2012-11-21 21:54 | 显示全部楼层 |阅读模式
按道理说AT89C51的P1口和地址的90H是映射的!但是在中断函数里面写上如下代码:
  1. INT0P:         ;外部中断0中断函数
  2. PUSH        P1       
  3. MOV         P1,         #0F6H
  4. MOV         R2,         #30
  5. DELAY0:
  6. LCALL        DELAY
  7. DJNZ        R2,         DELAY0
  8. POP         P1
  9. RETI


   刚刚进入中断的时候P1的值为0F3H,但是中断返回时P1的值并没有回到0F3H,而是保持在0F6H,也就是说POP  P1并没有执行成功,弹栈没有执行成功!!但是,我们在
  1. POP                P1


之前加上一条语句,如下
  1.                 POP                70H
  2.                 POP                P1


则弹栈可以成功,70H地址处的值被成功为0F3H,不知道这是什么问题!!!Keil编译器的Bug还是????求大侠解决

实际情况如下图::

    刚进入中断时的状态:


    中断函数执行完毕,将要执行POP P1时的状态:


     执行POP P1后的状态:(注意,这里执行后90H和P1寄存器的值都没有改变)



    若弹栈,把值谈到70H中,则可以弹栈成功,如下图:



    求大虾解释!!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
airwill 发表于 2012-11-21 22:25 | 显示全部楼层
我想, 这么专业的 Keil 应该不会这么笨.
会不会是 51 处理器的问题, 写端口不能用 POP 指令, 所以 Keil 才特意这样处理.
不过手头没有找到专业的 8051 编程手册, 没有能够核实这个猜测
 楼主| li460135301 发表于 2012-11-21 23:24 | 显示全部楼层
2# airwill 我搭了一块简单电路测试了一下!!程序实际烧到单片机里面弹栈数据时有弹栈的!也就是说在板子上实际显示过程中POP P1有效!!但是在Keil仿真图中显示无效!!!
ayb_ice 发表于 2012-11-22 08:26 | 显示全部楼层
本帖最后由 ayb_ice 于 2012-11-22 08:29 编辑

首先你的中断函数有严重问题,寄存器没有入栈,整个程序肯定是会有问题的,当然这并不影响你的P1问题

其次可能是读端口与读寄存器的区别,极有可能是堆栈指针都偏移了

这个问题跟踪一下堆栈指针的值就明白了
渤海三叠浪 发表于 2012-11-22 18:22 | 显示全部楼层
先 把优化级别搞到0再说
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:风沙星辰,永远相伴......

7

主题

18

帖子

1

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