|
但是,之后我说的下面这句被优化掉了,这个是正确的!
t = 0x8000 + 0x5555这条语句不执行。只能执行*(unsigned char *)t = 0xaa;
请看:
void main()
{
unsigned int t;
t = 0x8000 + 0x5555;
*(unsigned char *)t = 0xaa;
}
这是它的C代码
C:0x0021 7AD5 MOV R2,#0xD5
C:0x0023 7955 MOV R1,#0x55
C:0x0025 7B00 MOV R3,#0x00
C:0x0027 74AA MOV A,#0xAA
这是生成的汇编,连t这个变量都没有存在的迹像
所以,我的没错,的确是被编译器干掉了
为了向楼主和大家诚心地赔不是,我自己理解了但为了解决最终的问题,我也把分析结果大家分享一下吧...
void main()
{
volatile unsigned int t;
t = 0x8000 + 0x5555;
*(unsigned char *)t = 0xaa;
}
这是加了volatile声明后,看编译器生成的代码
3: volatile unsigned int t;
4:
5: t = 0x8000 + 0x5555;
C:0x0003 900000 MOV DPTR,#C_STARTUP(0x0000)
C:0x0006 74D5 MOV A,#0xD5
C:0x0008 F0 MOVX @DPTR,A
C:0x0009 A3 INC DPTR
C:0x000A 7455 MOV A,#0x55
C:0x000C F0 MOVX @DPTR,A
6: *(unsigned char *)t = 0xaa;
C:0x000D 900000 MOV DPTR,#C_STARTUP(0x0000)
C:0x0010 E0 MOVX A,@DPTR
C:0x0011 FE MOV R6,A
C:0x0012 A3 INC DPTR
C:0x0013 E0 MOVX A,@DPTR
C:0x0014 AA06 MOV R2,0x06
C:0x0016 F9 MOV R1,A
C:0x0017 7B00 MOV R3,#0x00
C:0x0019 74AA MOV A,#0xAA
C:0x001B 02001E LJMP C?CSTPTR(C:001E)
可以清楚地看到,编译器还是把加法干掉,只留下变量t,直接事先把计算好的值送入t(地址为片外的0x0000)注:在编译的时候我把RAM设为LARGE模式,所以直接放到片外去了
这时候可以看到,虽然t没有什么意义,但是编译器还是留下了它...
这也就加深体会了我对volatile的理解
|
|