注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

III = Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

C51生成汇编代码剖析(2)  

2017-10-28 11:05:32|  分类: C51(C&ASM) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关于变量
分析C51编译之后的代码,会将变量存放在哪里。
首先需要说明,编译器如果检测到有申明,但未初始化的变量,会给出警告,并且在生成代码的时候会忽略这些未使用的变量。
例如:
unsigned char a;//仅申明,如果后面一直不使用,就不会有任何与之相关的代码生成
但是:
unsigned char a=12;//申明+初始化,会生成代码
C51生成汇编代码剖析(2) - Lemniscate - 信息 灵感 创新
右边可以看到,将12赋值给了存储器0x08中,检查存储器可以证实:
C51生成汇编代码剖析(2) - Lemniscate - 信息 灵感 创新
  如果再跟一个char b,用负数为其初始化,则可以看到占据的存储器空间是紧跟在a之后,并采用补码的形式表示。
对于像int、long类型的,占据多个字节(int为2字节,long为4字节),摆放地址是高位在前,低位在后,测试如下:
C51生成汇编代码剖析(2) - Lemniscate - 信息 灵感 创新

float类型:
C51生成汇编代码剖析(2) - Lemniscate - 信息 灵感 创新
 这段代码说明了2个问题:
1. 变量所占据的地址,是根据申明的顺序,不是根据初始化的顺序。
2.浮点数按IEEE754规范表示(见下图),并且也是高位在前,低位在后,但写入方式是先写入低位(0x11),最后写入高位(0x0E)。
C51生成汇编代码剖析(2) - Lemniscate - 信息 灵感 创新
3. 代码0x0006处,出现的0x80,被反汇编解释为#P0,显然是单片机中的P0扣地址(0x80)。
 
bit类型
通过测试,bit类型会依次放在存储器第一个可位寻址(20H)的第一位,第二位等。
例如对于两个bit型的变量:
C:0x000F    D200     SETB     0x20.0
C:0x0011    C201     CLR      0x20.1
可见汇编代码采用了SETB和CLR两个指令分别设置1和0。另外,编译时,bit类型的地址是可以改变的。

sbit类型有点静态变量的意思,就是在申明时必须和某一个地址绑定,例如:
sbit SX=0xE0^4;
void main()
{
    SX=0;
    SX=1;
    while(1);
}
由于E0就是累加器A的地址,因此,SX为A的第四位,代码运行的结果就是A=0x10。

C51扩展关键字_at_
这个关键字可以对指定的存储空间进行绝对地址访问,但只能在全局变量中使用,例如:
data unsigned char c _at_ 0x33;
该语句相当于给存储器中地址在0x33的存储单元起名为c。
  评论这张
 
阅读(21)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017