5

什么是一个简短的说明性 C 程序,它演示了反汇编中易失性和非易失性之间的区别?

IE

int main()
{
    volatile int x;

    ???
}

对比

int main()
{
    int x;

    ???
}

我们可以用什么来替换两者???以使生成的代码不同?

4

3 回答 3

7

例如:

x = 0;

如果xis not volatile,编译器将看到它未被使用,并且可能会x = 0;从生成的代码中完全消除它(语句甚至变量本身)作为优化。

但是,该volatile关键字正是为了防止编译器这样做。它基本上告诉代码生成器“无论你认为这个变量是/做什么,不要再猜我,我需要它。” 因此,编译器会将 volatile 变量视为已访问,并将发出与表达式对应的实际代码。

于 2012-11-03T07:45:19.483 回答
2

这可能不是最短的例子,但它volatile嵌入式系统中很常见,假设x指向寄存器的地址,如果volatile不使用,编译器将假设 的值x不会改变并删除循环:

volatile long *x = (long*) REGISTER_BASE;
while (!(x&0x01)) {
   //do nothing;
}
于 2012-11-03T07:47:33.047 回答
0

你也可以试试这个:

x=1;
x=2;
return x;

打开优化并检查两者的反汇编。

于 2012-11-03T07:56:40.310 回答