搜索
bottom↓
回复: 5

懂义隆单片机汇编的进来看看,这是不是义隆C编译器的BUG?

[复制链接]

出0入0汤圆

发表于 2011-2-28 14:48:46 | 显示全部楼层 |阅读模式
环境:eUIDE
单片机:EM78P153S

//这是编译器自己产生的C程序框架,我一句没动
void main()
{

}
void _intcall interrupt(void) @ int
{

  // Write your code (inline assembly or C) here
   
  //restore ACC
  _asm
   {
             reti            //Tell Compiler to recover common registers here.
                              //Don't remove or duplicate this instruction in this function
   }
}
void _intcall interrupt_l(void) @ 0x08:low_int 0
{
       
}

//下面是上面C代码编译产生的汇编代码,我也一句没动
  JMP   0x001           ;'0x000000'
  RET                   ;'0x000001'
  ADD   A, @0xFF        ;'0x000002'
  ADD   A, @0xFF        ;'0x000003'
  ADD   A, @0xFF        ;'0x000004'
  ADD   A, @0xFF        ;'0x000005'
  ADD   A, @0xFF        ;'0x000006'
  ADD   A, @0xFF        ;'0x000007'
  JMP   0x00B           ;'0x000008'
  ADD   A, @0xFF        ;'0x000009'
  ADD   A, @0xFF        ;'0x00000A'


  MOV   0x10, A         ;'0x00000B'//把A的值保存到0x10寄存器里
  SWAPA 0x04            ;'0x00000C'
  MOV   0x20, A         ;'0x00000D'//把R4的值保存到0x20寄存器里
  SWAPA 0x03            ;'0x00000E'
  MOV   0x21, A         ;'0x00000F'//把R3的值保存到0x21寄存器里

  SWAPA 0x21            ;'0x000010'
  MOV   0x03, A         ;'0x000011'//恢复R3
  SWAPA 0x20            ;'0x000012'
  MOV   0x04, A         ;'0x000013'//恢复R4
  SWAP  0x1F            ;'0x000014'
  SWAPA 0x1F            ;'0x000015'//这里恢复A的值时,怎么变成了0x1F ???
  RETI                  ;'0x000016'

这里的疑问是,中断保存现场时,是把A的值保存到0x10里了,恢复时怎么从0x1f里恢复?

出0入0汤圆

发表于 2011-2-28 16:01:13 | 显示全部楼层
对于硬件没有保护任何寄存器的单片机,需要自己手动保护A

可以参考手册中的说明!

Example 3:
EM78567: This particular MCU has only one interrupt vector.  The hardware
does not save nor restore any register and Compiler just can save and restore R3
and R4.  
void _intcall interrupt(void) @ int  
{   
// Write your code (inline assembly or C) here
   
//restore ACC and R5
   _asm {
      reti     //tell compiler to recover common registers here
      SWAPA 0X1E      
      MOV 0X5,A        
      SWAP 0X1F
      SWAPA 0X1F  
    }     
}
void _intcall interrupt_l(void) @ 0x08:low_int 0
{
  //save ACC and R5
  _asm {
     MOV 0X1F,A
     SWAPA 0X5
     MOV 0X1E,A
     PAGE @0X0

出0入0汤圆

 楼主| 发表于 2011-2-28 16:10:05 | 显示全部楼层
先谢谢楼上的,你说的那个是例子3,我用那个EM78567芯片,下面是程序自动生成的框架,已经包含了这些内容,可153S应该属于例子2的,是由硬件和编译器去保存和恢复关键寄存器的,实际生成的汇编里面也有了这段代码,但我就不明白保存时是0x10,恢复时却变成了0x1f。
void main()
{

}


void _intcall interrupt(void) @ int
{
   
// Write your code (inline assembly or C) here

   //restore ACC,R5
   _asm
    {
              reti            //Tell Compiler to recover common registers here.
                                                                       //Don't remove or duplicate this instruction in this function
      SWAPA 0X1E      
      MOV 0X5,A
      SWAP 0X1F
      SWAPA 0X1F      
    }
}

void _intcall interrupt_l(void) @ 0x08:low_int 0
{
  //save ACC and R5
  _asm
   {
     MOV 0X1F,A
     SWAPA 0X5
     MOV 0X1E,A
     PAGE @0X0     
   }         
}

出0入0汤圆

 楼主| 发表于 2011-2-28 22:50:01 | 显示全部楼层
是不是用义隆的人很少啊,我用仿真器仿真无法进入中断,全速运行时没问题(但全速无法看寄存器变量,还是不怎么放心)

出0入0汤圆

发表于 2011-3-1 09:58:57 | 显示全部楼层
回复【3楼】wuha 东方不败
-----------------------------------------------------------------------

单步是不能进中断的,这个问题已经问过ELAN的人了,这是义隆单片机仿真器的缺点。

出0入0汤圆

发表于 2011-3-1 10:00:13 | 显示全部楼层
中断,用断点的方式来拦截吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 15:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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