用的51,现象是赋值错误,跟踪反汇编如何解决?

2019-07-15 17:00发布

我用的是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这一句汇编。

请教高手,何解?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
Aidaohuakai
1楼-- · 2019-07-15 19:43
现在还用80C32啊?好像被灭绝了吧!
天启之门
2楼-- · 2019-07-16 01:25
第三书包网  shubaosan.com
天启之门
3楼-- · 2019-07-16 02:48
第三书包网  shubaosan.com

一周热门 更多>