找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3092|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机现象是赋值错误,跟踪反汇编,目前搞不定!!

[复制链接]
跳转到指定楼层
楼主
ID:81275 发表于 2015-5-27 17:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是51,型号是80c32,外挂的rom和ram和can总线。我在main函数里执行了一下某段初始化函数,在定时器中断里也执行了该段函数,如下:
init()//初始化函数
{
................
addr = addr_reg1;
*addr = 0x06;
................
}

timer1_isr() interrupt3 using2
{
  init();//中断里运行
}

main()
{
  init();//首次运行
  while(1)
  {
  .........
  }
}

硬件跑,出错,发现我指定的给某地址赋值06,结果是另一个变量变成了06了。

然后我用keil,软件仿了一下,也同样出错。

我用反汇编,单步调试,后来追查到,另一个被错赋值的变量,是在中断里被赋值的。

单片机有4组r0-r7,发现编译器在主程序中用的是第0组r0-r7(using0),在进入定时器中断时,确实是用我指定的第2组(using0)。


但赋值出错的那几条语句,它读取的是固定的0x06地址的值(即第0组的r6),而不是用我指定的第2组的寄存器,使得指向地址出错,导致0x06被赋值到其他地址上去了。


具体的错误语句是 MOV R4,0x06,0x06是第0组寄存器的R6地址;如果是生成 MOV R4,R6就不会有错,采用的是第2组(using2)的寄存器。


我把定时器中断指定的using2字眼去掉,发现编译器自动分配了采用第0组寄存器去处理中断,这样就没出错了。但是,给定时器指定using1,using2,using3都出错。都生成了MOV R4,0x06这一句汇编。


请教高手,和解?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表