打印

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

[复制链接]
2111|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
按道理说AT89C51的P1口和地址的90H是映射的!但是在中断函数里面写上如下代码:
INT0P:         ;外部中断0中断函数
PUSH        P1       
MOV         P1,         #0F6H
MOV         R2,         #30
DELAY0:
LCALL        DELAY
DJNZ        R2,         DELAY0
POP         P1
RETI


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


之前加上一条语句,如下
                POP                70H
                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问题

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

这个问题跟踪一下堆栈指针的值就明白了

使用特权

评论回复
5
渤海三叠浪| | 2012-11-22 18:22 | 只看该作者
先 把优化级别搞到0再说

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

7

主题

18

帖子

1

粉丝