在C中会遇到一个一个不是很常用的关键字volatile,如果是仅仅是应用层编程,在控制台打印东西,这个用的不多,但是在C的嵌入式编程这个关键字会很有用,使用它编译器不会对C代码进行优化,老老实实将C直接转换成汇编,否则会出现优化。下面还是举个例子来理解:
1.未使用关键字volatile声明局部变量
C代码:
#include<reg51.h>
char num2;
void main()
{
char tem;
tem=2;
tem=3;
tem=4;
num2=2;
num2=3;
num2=9;
while(1);
}
编译后的汇编代码:
5: void main()
6: {
7: char tem;
<span style="color:#ff0000;"> 9: tem=2;
10: tem=3;
11: tem=4;</span>
12: num2=2;
C:0x080C 750802 MOV num2(0x08),#0x02
13: num2=3;
C:0x080F 750803 MOV num2(0x08),#0x03
14: num2=9;
C:0x0812 750809 MOV num2(0x08),#0x09
15: while(1);
C:0x0815 80FE SJMP C:0815
C代码:
#include<reg51.h>
char num2;
void main()
{
volatile char tem;
//加了关键字 volatile之后 在编译时 每条语句都会有相应的代码 不会被忽略
tem=2;
tem=3;
tem=4;
num2=2;
num2=3;
num2=9;
while(1);
}
编译后的汇编代码:
5: void main()
6: {
7: volatile char tem;
8: //加了关键字 volatile之后 在编译时 每条语句都会有相应的代码 不会被忽略
<span style="color:#ff0000;"> 9: tem=2;
C:0x0800 750902 MOV 0x09,#0x02
10: tem=3;
C:0x0803 750903 MOV 0x09,#0x03
11: tem=4;
C:0x0806 750904 MOV 0x09,#0x04</span>
12: num2=2;
C:0x0809 750802 MOV num2(0x08),#0x02
13: num2=3;
C:0x080C 750803 MOV num2(0x08),#0x03
14: num2=9;
C:0x080F 750809 MOV num2(0x08),#0x09
15: while(1);
C:0x0812 80FE SJMP C:0812
注意汇编代码的红色对比部分,加上关键字volatile的局部变量,在由C编译成汇编时,每一句C赋值语句都老老实实的编译成汇编代码,而未加关键字的volatile的局部变量,在由C编译成汇编时,所有赋值语句被忽略,编译器没有分配给tem内存空间。在这里仅仅是通过一个小例子说明关键字volatile的作用,其作用就是告诉编译器声明的变量,值是不断发生变化的,每次存取都要通过寄存器,不能优化。