從彙編看volatile

發現一個有趣的MDK編譯器存儲優化現象,

unsigned   int   t1 = 0;

unsigned   char   t2 = 0;
unsigned   int   aaa=1;//volatile    unsigned  int  aaa=1;
unsigned   char   t3 = 0;
unsigned   char   t4 = 0;
unsigned   char   t5 = 0;

unsigned   char   t6 = 0;

int    main(void)

{

t1=t1;

t2=t2;

t3=t3;

t4=t4;

t5=t5;

while(aaa);


return 0;

}

上面的程序在編譯後反彙編查看,發現變量的存儲很有意思:

0x30020460:t2

0x30020461:t3

0x30020462:t4

0x30020463:t5

0x30020464:t6

0x30020468:t1

0x3002046c:aaa

也就是說編譯器優先排列char型變量(單字節),然後再排整形變量(4字節),由此可以看出編譯器的代碼空間的優化算法應該就是這樣的。(PS:我並不懂編譯器原理)

另外,還要講一下重點。

while(aaa);

這條語句的彙編代碼(示意代碼)是:

LDR      r0,[&aaa]

label:
CMP      r0,#0
BNE      label

如果將aaa聲明成volatile型的。那麼彙編的結果是:

label:

LDR      r0,[&aaa]

CMP      r0,#0

BNE      label

這樣來理解volatile的作用應該更容易。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章