目的将buf[0]取反后在crc8_table[]数组里查表
1,直接取反查表 buf[0]=crc8_table[~buf[0]],得到的数据是错误的。
编译结果
0020C E286 LDI R24,0x26
0020D E090 LDI R25,0
0020E 91E0 008D LDS R30,buf //调用buf 视为16BIT了
00210 27FF CLR R31
00211 95E0 COM R30 //取反
00212 95F0 COM R31
00213 0FE8 ADD R30,R24
00214 1FF9 ADC R31,R25
00215 9024 LPM R2,Z
00216 9220 008D STS buf,R2
ICC将buf[0]视为16位的了。如0X01取反将是0XFFFE,查出结果错误。
2, 必须加上unsigned char声明,
buf[0]=crc8_table[(uchar)~buf[0]]
编译结果
0020C E286 LDI R24,0x26
0020D E090 LDI R25,0
0020E 91E0 008D LDS R30,buf //还是视为16BIT
00210 27FF CLR R31
00211 95E0 COM R30
00212 95F0 COM R31
00213 27FF CLR R31 //声明为uchar,清除高8bit
00214 0FE8 ADD R30,R24
00215 1FF9 ADC R31,R25
00216 9024 LPM R2,Z
00217 9220 008D STS buf,R2
3, 用一个临时变量
datatemp=~buf[0];
buf[0]=crc8_table[datatemp];
编译结果
(0125) datatemp=~buf[0];
0020B 90A0 008D LDS R10,buf
0020D 94A0 COM R10
(0126) buf[0]=crc8_table[datatemp];
0020E E286 LDI R24,0x26
0020F E090 LDI R25,0
00210 2DEA MOV R30,R10
00211 27FF CLR R31
00212 0FE8 ADD R30,R24
00213 1FF9 ADC R31,R25
00214 9024 LPM R2,Z
移来移去的。
要怎么写才能直接认为是8bit取反,查表呀?
就是希望这样的编译结果
0020C E286 LDI R24,0x26
0020D E090 LDI R25,0
0020E 91E0 008D LDS R30,buf //取buf[0]
// 00210 27FF CLR R31 不存在
00211 95E0 COM R30 //取反
// 00212 95F0 COM R31 不存在
00213 27FF CLR R31 //清除高8bit
00214 0FE8 ADD R30,R24
00215 1FF9 ADC R31,R25
00216 9024 LPM R2,Z //查表
00217 9220 008D STS buf,R2 |