簡體   English   中英

示例C代碼演示了反匯編中的volatile?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM