編譯器優化問題

2021-05-23 09:05:44 字數 707 閱讀 9260

今天遇一程式,

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

編譯器優化

常量摺疊 a 1 2 由於結果可預見,編譯器直接生成a 3 常量傳播a 1 若後續 沒有更改a,則編譯器將a直接用其值1代替 減少變數 對於x和y的比較,可以轉換成if i j x i2 y j 2 if x y 複寫傳播 類似於常量長傳,不過傳播的是變數 若後續 未修改a的值,則編譯器用m代替a ...

踩坑編譯器優化問題

故事背景 最近在除錯自己畫的板子時,又再次遇到了變數被編譯器優化的問題。雖然不是第一次遇到這個問題了,但還是花了一些時間才定位到這個點。為了警醒自己,避免再在這個問題上浪費時間,特記錄下來。問題描述 除錯 時,發現rxflag 串列埠接收資料完成標誌 被置起時,無法進入 if 條件語句。問題分析 如...

編譯器優化 乘法優化

由這個想到的 31乘以某個數能不能寫成這個數乘以2的次冪 再減去這個數。用數學語言表達一下就是 設這個數為x 31 x x 2 n x 這個等式是否存在,如果存在,求n的值 那我們計算一下,31 2 n 1 得2 n 32 得n 5 也就是說存在那麼乙個n使得,31乘以某個數的結果等於這個數乘以2的...