/******************************************************************************************************************
参考:
说明:。
******************************************************************************************************************/
记一下概念的东西,有我自己的认识:
关于ARM THUMB两个状态,我自己的见解就是就像现在的电脑,新买的CPU都是64位的,但是也可以装成32位的系统xp或win7,这就是CPU工作的32位状态。而如果装了64位的win7那CPU就工作在64位了,那么是ARM状态就对应上边例子中的64位的,THUMB对应32位的,这应该是一个过度。我问过u-boot Linux都是一直工作在ARM状态,一直都没有一点THUMB状态,对于那种刚开始学这个,没做过项目的老师们一再讲这个就现在想想没有多大的意义了。对于PC机来说现在是32位到64位的过渡,但是对于已经是后32位的时代的,还要讲16的东西,就该往前看看多说说64位的事了。关于汇编学习的程序,先说它在哪里用到了吧。在u-boot 或者Linux的起始时用的是汇编,至于为什么这样,可以想想飞机的原理,飞机就是要摆脱轮子的慢,但是在飞机的起飞阶段,飞机还是要用轮子的。这是为什么,因为轮子可以有它的优点。就想上边两种情况要用汇编一样,这样作用就明了了。真正造车的才会深入了解轮子的各种信息(这种就是指芯片公司的AP工程师)。嵌入式学习者就像说相声的各个方面都要学习,京剧,二人转。不过那都叫学唱,同样道理对于嵌入式学习者来说,汇编的作用也就是这了。
关于汇编中的标号就是一个内存地址的别名:
如下图的START其实就是30000000,但是你在跳转的时候还是记忆START是更容易的。
关于DCD和SPACE:
StackUsr DCD UsrStackSpace
AREA MyStacks,DATA,NOINIT,ALIGN = 2
UsrStackSpace SPACE USR_STACK_LEGTH*4
以上代码等价于C
语言中的: int *p = malloc(USR_STACK_LEGTH*4)
我个人认为汇编因为中不能将这样写,所以就找了UsrStackSpace来作中间量,它只是打酱油的,没有在历史上起到重要作用。
StackUsr DCD SPACE USR_STACK_LEGTH*4
也可以这么说,如果代码仅有上边的,那么:StackUsr DCD UsrStackSpace会显得多余了,因为好正力就可以看出直接中UsrStackSpace就可以了。
但是由于UsrStackSpace代表这一块内存的首地址了,我要是以后经常访问尾地址了怎么办,再来一个玩意来存着尾地址。就用StackUsr了。让StackUsr干活还要把它伺候好了,它本身也要占个位置,这就用到了DCD了,DCD给StackUsr找个位置,然后就开始给它任务了。如果把UsrStackSpace交给它,那么StackUsr 和UsrStackSpace就一个样了;如果把UsrStackSpace + (USR_STACK_LEGTH - 1)*4 给它,那么StackUsr指向了这个块的末地址。至于谁会这要求,那就是堆栈了!
关于堆栈,就是栈。我有我的看法,这就好比一个好师傅在拆一个录音机,螺丝大小不一。那么拆的时候一般会将它们按照顺序放着,这么做的目的就是为了一会儿修好了之后再装的时候能一个一个对应着装上去。慢慢引入解释就是说这个师傅把拆下的螺丝都放到了栈中,就是一个司空见惯的一个东西起了一个新名。师傅是靠各个螺丝的物理位置不同来安装的,但是对于计算机来说它是“平面”的,只有先后顺序没有物理位置,只能靠拆下每个螺丝的顺序来区别了,相当于画一个表,有1 2 3..顺序,然后将螺丝一一放入对应位置,装的时候就反序一个装上去。这样就不会有错了。说这么一大堆就是一个怕搞错了。
计算机什么时候这样做呢,就是用C语言编程在调用子函数时候,这个时候就相当于这个师傅要拆录音机了。子函数调用完后,就要回来继续运行主函数,这个时候就相当于师傅要装上录音机了。这时候就要看看在调用子函数时有没有做好善后工作了,有没有把主函数的状态保存下来,回来的时候好还原出来当初的状态。放状态的容器就是“栈”,为也还原时不出错,要状态所涉及的所有东西一一按照顺序放到这个容器里,到时候还原的时候再按时一定的顺序取出来,如果两个顺序都定死了,以后就不会出错了。关于制定这两个顺序大家想到了,规定一个这个容器只有一个口.....(关于这个顺序暂时还没有想到通俗的例子)