[英]Example C code that demonstrates volatile in disassembly?
什么是簡短的說明性C程序,它演示了反匯編中易失性和非易失性之間的區別?
即
int main()
{
volatile int x;
???
}
VS
int main()
{
int x;
???
}
什么可以取代兩個???
這樣生成的代碼是不同的?
例如:
x = 0;
如果x
不是volatile
,編譯器將看到它未被使用,並且可能完全從生成的代碼中作為優化消除它( x = 0;
語句甚至變量本身)。
但是, volatile
關鍵字正是為了防止編譯器執行此操作。 它基本上告訴代碼生成器“無論你認為這個變量是什么/做什么,不要再猜測我,我需要它。” 因此,編譯器會將volatile變量視為已訪問,並將發出與表達式對應的實際代碼。
這可能不是最短的例子,但它是嵌入式系統中volatile
的常見用法,假設x
指向寄存器的地址,如果不使用volatile
,編譯器將假設x
的值不會改變並將刪除循環:
volatile long *x = (long*) REGISTER_BASE;
while (!(x&0x01)) {
//do nothing;
}
你也可以試試這個:
x=1;
x=2;
return x;
打開優化,檢查兩者的反匯編。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.