关键字volatile 在C51中的使用

本文探讨了C语言中不常使用的volatile关键字,在嵌入式编程中的重要性。通过示例对比了使用与未使用该关键字时,编译器对代码的不同处理方式,揭示了其防止编译器优化、确保变量值实时更新的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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


1.使用关键字volatile声明局部变量

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的作用,其作用就是告诉编译器声明的变量,值是不断发生变化的,每次存取都要通过寄存器,不能优化。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值