|
发表于 2010-12-22 00:58:27
|
显示全部楼层
y=(unsigned char)(((unsigned int)((r*80u)+(g*144u)+(b*32u)))>>8);
优化的确实不错,用在单片机上也很快,在AVR上试只需要18个周期。
(0006) void main(void)
(0007) {
(0008) unsigned char r,g,b;
(0009)
(0010) r=111; g=222; b=123;
_main:
b --> R16
g --> R20
r --> R18
0003C E62F LDI R18,0x6F
0003D ED4E LDI R20,0xDE
0003E E70B LDI R16,0x7B
(0011)
(0012) PORTB=(unsigned char)(((unsigned int)((r*80u)+(g*144u)+(b*32u)))>>8);
0003F E980 LDI R24,0x90
00040 9F84 MUL R24,R20
00041 0110 MOVW R2,R0
00042 E580 LDI R24,0x50
00043 9F82 MUL R24,R18
00044 0120 MOVW R4,R0
00045 0C42 ADD R4,R2
00046 1C53 ADC R5,R3
00047 E280 LDI R24,0x20
00048 9F80 MUL R24,R16
00049 0C40 ADD R4,R0
0004A 1C51 ADC R5,R1
0004B 2C45 MOV R4,R5
0004C 2455 CLR R5
0004D B845 OUT 0x05,R4
(0013)
(0014) while(1);
FILE: <library>
0004E CFFF RJMP 0x004E
0004F 9508 RET |
|