经常听到很多人说这么一句话,指针就是地址!这句话非常正确。所谓地址又是什么呢?地址其实就是计算机的内存的索引。具体到MCU,其实就是单片机的内存地址,包括数据区地址和程序区地址。在任何一款单片机的手册中都会介绍该产品的地址分布。如果使用汇编语言编程,对地址分布就非常明白了。比如将某个地址的数据移动到A寄存器中的汇编指令是 mov ACC 0x08. 就是讲内存0x08的地址中内容存储到ACC寄存器中。
为什么使用C语言的程序员觉得地址非常抽象?因为C语言的优势是不需要太关注硬件的细节。这些细节问题编译器会替我们处理好。将我们解放出来更多考虑业务层面的东西。也就是产品的具体功能应用。比如我们写出以下语句:
unsigned char x;
x=3;
这是非常简单的两句C语言的语句。第一行声明一个 无符号字符的变量x,第二行给x赋值 3.这两句非常简单。我们在写一句:
x=5;
这也是一句非常简单的语句,就是给x赋值5.
我们有没有考虑过以上三行C语句,MCU怎么去理解。也就翻译成机器码后MCU怎么执行。为了明白这一点,我们必须先明白第一句 unsigned char x,到底是什么意思。这个问题是我的同事李工给一位参加工作一年的同事提出的问题。任何人都可以回答出是声明一个变量。在向具体问,就没有下文了。
unsigned char x;这句是声明一个变量。但是“声明一个变量”又是什么意思?其实就是在内存中分配一个地址。 可以通过“x”索引到这个地址。我们重新来理解一下这三行语句,
unsigned char x; 在内存中分配出一个地址,比如0X10
x=3; 在0X10地址内存入3
x=5; 在0X10地址内存入5
是不是这样,我们做一个实验来验证一下。
void main(void)
{
volatile unsigned char x;
x =3;
x=5;
}
经过编译,进行调试,我们看到目标代码如下:
C:0x000C 02000F LJMP main(C:000F)
3: void main(void)
4: {
5: volatile unsigned char x;
6:
7: x =3;
8:
C:0x000F 750803 MOV 0x08,#0x03
9: x=5;
10:
C:0x0012 750805 MOV 0x08,#0x05
11: x=x;
12:
13:
C:0x0015 850808 MOV 0x08,0x08
14: }