|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | 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 于 2004/9/27 7:45:00 发布:
诸位是怎么处理在线汇编程序中调用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 于 2004/9/27 8:59:00 发布:
诸位有无好的解决方法 ICCAVR 编译器只有两种优化设置(基本优化和代码压缩优化)且必须选择一种,如果选择代码压缩优化,问题就能解决,可有些书上说选择代码压缩优化可能会引起一些奇怪的问题,请问诸位有无好的解决方法。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |