繁体   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