今天遇一程式,
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的...