登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

请各位分析下面的程序为什么会出现这样结果?

作者:querli_wjh 栏目:单片机
请各位分析下面的程序为什么会出现这样结果?
请各位高手分析下面的程序,编译后第<0063>行程序:
(0063)    j=j&0x3f;
    0075 738F      ANDI    R24,0x3F
    0076 2EA8      MOV    R10,R24
    
    为什么不是:  MOV R24,R10
        ANDI R24,0X3F
        MOV R10,R24
--------------------------------------------------------

#include "iom8v.h"
const unsigned CHAR tabel[]={0x02,0xe3,0x11,0x41,0xe0,0x48,0x08,0x63,0x00,0x40,0xfb};
          /*     显示缓冲区       */
unsigned CHAR ledbuff[]={0x07,0x08,0x09,0x04,0x05,0x06};
void port_init(void)//端口初始化
{
  DDRD=0xfb;
  DDRB=0x33;
  PORTD=0xff;
  PORTB=0x33;
  DDRC=0x30;
  PORTC=0x30;
}
void delay_1ms(void)
{
    unsigned CHAR a, b;
    for (a = 1; a<0x90; a++)
        for (b = 1; b<0x30; b++)
            ;
}

void DISPLAY(void)//六路动态扫描显示电路
{
unsigned CHAR h,i,j,k;
for (i=0;i<3;i++)
  {
   j=ledbuff[i];
   k=tabel[j];
   j=k&0x3f;
   h=PIND&0xc4;
   PORTD=h|j;
   h=PINB&0xde;
   //j=k&0xc0;
   asm("mov r0,%j\n" "bst r0,6\n" "bld r0,0\n" "bst r0,7\n" "bld r0,5\n" "mov %j,r0");
   j=j&0x3f;
   k=h|j;
   PORTB=k;
   if ((i==0)||(i==4)||(i==5)) PORTB|=(1<<4);
   else PORTB&=~0X10;
   if ((i==0)||(i==2)) PORTC|=(1<<5);
   else PORTC&=~0X20;
   if ((i==3)||(i==5)) PORTC|=(1<<4);
   else PORTC&=~0x10;
   delay_1ms();     //每一位显示保持一定时间
   }
}

void main(void)
{
unsigned CHAR i;
port_init();
while(1)
   {
    DISPLAY();
   }
}
-----------------------------------------------------------
部分ICCAVR6.31编译后的程序

(0061)    j=k&0xc0;
    006D 2F86      MOV    R24,R22
    006E 7C80      ANDI    R24,0xC0
(0062)    asm("mov r0,%j\n" "bst r0,6\n" "bld r0,0\n" "bst r0,7\n" "bld r0,5\n" "mov %j,r0");
    006F 2C0A      MOV    R0,R10
    0070 FA06      BST    R0,6
    0071 F800      BLD    R0,0
    0072 FA07      BST    R0,7
    0073 F805      BLD    R0,5
    0074 2CA0      MOV    R10,R0
(0063)    j=j&0x3f;
    0075 738F      ANDI    R24,0x3F
    0076 2EA8      MOV    R10,R24

2楼: >>参与讨论
querli_wjh
诸位是怎么处理在线汇编程序中调用c局部变量?
  我觉得造成这种错误结果是由于编译器自作聪明将变量j优化了,如果j是全局变量(volatile unsigned CHAR j)    
其结果就是对的,请看下面的程序,其编译结果是正确的,如果将29行改写为:k=j;又会出现上面的错误。
1    #include "iom8v.h"
2    #pragma data:code
3    const unsigned CHAR tabel[]={ 0x02,0xe3,0x11,0x41,0xe0,0x48,0x08,0x63,0x00,0x40,0xfb};
          /*     显示缓冲区       */
4    #pragma data:data
5    unsigned CHAR ledbuff[]={0x01,0x02,0x03,0x04,0x05,0x06};

6    void port_init(void)//端口初始化
7       {
8          DDRD=0xfb;
9          DDRB=0x33;
10         PORTD=0xff;
11         PORTB=0x33;
12         DDRC=0x30;
13         PORTC=0x30;
14       }
15    void delay_1ms(void)
16      {
17         unsigned CHAR a, b;
18           for (a = 1; a<0x90; a++)
19        for (b = 1; b<0x30; b++)
20           ;
21      }
22
23    void DISPLAY(void)//六路动态扫描显示电路
24    {
25     unsigned CHAR i,j,k;
26     for (i=0;i<6;i++)
27      {
28       j=tabel[ledbuff[i]];
29       k=tabel[ledbuff[i]];
30         k=k&0x3f;
31         PORTD &=0xc4;
32         PORTD |=k;
33        j=j&0xc0;
34         asm("mov r0,%j\n" "bst r0,6\n" "bld r0,0\n" "bst r0,7\n" "bld r0,5\n""mov %j,r0");
35         j=j&0x3f;
36        PORTB &=0xde;
37         PORTB |=j;
38        if ((i==0)||(i==4)||(i==5)) PORTB|=(1<<4);
         else PORTB&=~0X10;
         if ((i==0)||(i==2)) PORTC|=(1<<5);
         else PORTC&=~0X20;
         if ((i==3)||(i==5)) PORTC|=(1<<4);
         else PORTC&=~0x10;
         delay_1ms();     //每一位显示保持一定时间
      }
    }

3楼: >>参与讨论
querli_wjh
诸位有无好的解决方法
ICCAVR 编译器只有两种优化设置(基本优化和代码压缩优化)且必须选择一种,如果选择代码压缩优化,问题就能解决,可有些书上说选择代码压缩优化可能会引起一些奇怪的问题,请问诸位有无好的解决方法。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
AVR下载电缆,双龙太小气!!
STK500_M8再次更新,现在是V2.0[新建个贴子]
Mega16,22元,还是有点贵,如果到15元更好,其实总线基本不用
利用U盘为存储媒体可直接播放U盘的MP3播放器
谁玩过AVR做MP3播放器吗
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号