由于学校里面教的时候用的是汇编编的程序,c都是我自学的,所以在编程序的时候遇到一个很怪的问题怎么都想不通
比如我们用汇编的时候直接用TCON,但是用c编的时候却要在申明变量的时候指定TCON的地址 SFR TCON=OX88H;
但是在用标准c编程序的时候却是直接申明一个变量就是了,就算是编译器自动付值地址;那在用 SFR 的时候也应该是申明一个指针变量才对啊???(SFR *TCON=88H)
我仔细看了一下 SFR 确实是声明一个寄存器变量,而且后面程序引用的时候还是TCON=xxxx(为TCON付值),那就明确他不是一个地址了,既然不是地址那在申明的时候又为什么能够为它付一个地址值了?
我打开‘reg51.h'看到的也是SFR TCON=OX88H 的申明;
这就不明白了。到底TCON 是变量还是变量地址,如果是地址为什么不用申明地址指针,还在后面直接引用;不是地址的话那又为它付地址值,
SFR TCON=88H
这就是C51的独特之处,这表示对TCON声明地址.
以后使用 TCON=xxxx就是对TCON进行赋值了.
我的矛盾就是为什么在用标准c 的时候申明部分变量与地址的申明是不同的,但是单片机里面却可以是变量与地址都用一次就行了,想不通啊
很难理解吗?
SFR 就是定义了一个指定了硬件地址的变量,一条特殊的语句.和51的硬件是紧密相关的,只能是0x00到0xff.是C51独有的.
C语言中变量不允许(或者说不推荐)直接指定地址,而是由编译器来指定变量地址.
这是C51和C的区别.
51单片机,一般在头文件中已经把特殊功能寄存器的地址定义好了,我们在使用的时候直接读写寄存器名就行了,
你在用汇编写的时候,是把数据直接送到寄存器的地址还是把数据送到寄存器成名呢?如果你是直接把数据 mov 到了寄存器名称,那么看看你的头文件,那里有没有给寄存器定义地址
打开reg51.h,reg52.h,特殊功能寄存器在51系列中也属于地址因为累加器也是一个地址,因为0x??不好记,而你学习的时候已经学过单片机有累加器,所以可以把特殊功能寄存器的地址先定义你已知的名称你就可以很快速掌握这个编程工具,是不是你想开发一个编程器SFR定义一个地址是怎样操作,你就不可能再用SFR定义一个硬件地址,如果用汇编的话,有的已经编程器的任务,如果想知道很清楚,就用机器码?在内存中放好数据连接好电线,打开电源程序就可以知道你的数据是不是放的正确.不过这个时代已经成为历史.
引用: 引用 7 楼 lbing7 的回复:
LZ,你理解成:C51就是这样
这就可以了
呵呵
--------------这是他定的标准,你何必无故去怀疑呢?楼主,哈哈,就像C语言为什么会这么写。