标题: 51单片机现象是赋值错误,跟踪反汇编,目前搞不定!! [打印本页]

作者: larryk    时间: 2015-5-27 17:17
标题: 51单片机现象是赋值错误,跟踪反汇编,目前搞不定!!
我用的是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这一句汇编。


请教高手,和解?






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1