今天遇一程序,
unsigned char a,b,c;
a = 0x89;
b = a>>1;
c = a&b;
在单步调试的时候,观察数值发现b的值为0,分析b的值应当为0x44,百思不得其解,通过查看其汇编语句,发现问题所在。
汇编语句如下:
MOV R7,#TMOD(0x89)
MOV A,R7
CLR C
RRC A
ANL A,R7
MOV 0x08,A
由此我们可以看到,由于b只是参与中间运算,并没有实际使用,因此编译器把b优化掉了,直接没使用b。
如果不想让编译器进行优化,可以加上关键字volatile,程序如下:
c语言:
volatile unsigned char a,b,c;
a = 0x89;
b = a>>1;
c = a&b;
汇编语言:
MOV 0x08,#TMOD(0x89)
MOV A,0x08
CLR C
RRC A
MOV 0x09,A
MOV A,0x08
ANL A,0x09
MOV 0x0A,A