|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請各位分析下面的程序為什么會出現(xiàn)這樣結(jié)果? |
| 作者: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}; /* 顯示緩沖區(qū) */ 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)//六路動態(tài)掃描顯示電路 { 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 發(fā)布:
諸位是怎么處理在線匯編程序中調(diào)用c局部變量? 我覺得造成這種錯誤結(jié)果是由于編譯器自作聰明將變量j優(yōu)化了,如果j是全局變量(volatile unsigned CHAR j) 其結(jié)果就是對的,請看下面的程序,其編譯結(jié)果是正確的,如果將29行改寫為:k=j;又會出現(xiàn)上面的錯誤。 1 #include "iom8v.h" 2 #pragma data:code 3 const unsigned CHAR tabel[]={ 0x02,0xe3,0x11,0x41,0xe0,0x48,0x08,0x63,0x00,0x40,0xfb}; /* 顯示緩沖區(qū) */ 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)//六路動態(tài)掃描顯示電路 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 發(fā)布:
諸位有無好的解決方法 ICCAVR 編譯器只有兩種優(yōu)化設(shè)置(基本優(yōu)化和代碼壓縮優(yōu)化)且必須選擇一種,如果選擇代碼壓縮優(yōu)化,問題就能解決,可有些書上說選擇代碼壓縮優(yōu)化可能會引起一些奇怪的問題,請問諸位有無好的解決方法。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |