1.2 8051处理器基本模型
基于上述原则,我们来讨论8051处理器的架构。在分析前,首先建立处理器的基本概念。处理器架构的基本模型如图1.1所示。
图1.1 处理器架构的基本模型
该图分为三部分:最左边的方框是指令池(CODE区);最右边的方框是数据池(数据区);中间虚线区域为处理器模型。CODE区和数据区是处理器设计的两大主题,它们解决了软核处理器的两大难点:该怎么做和对谁做。CODE区里从0开始按顺序排列着指令,软核处理器可从它那儿得到该怎么做的信息。数据区作为数据的存储池,它也按顺序排列着数据,软核处理器可从它那儿得到处理的对象。一般来说,软核处理器从CODE区里面读出指令,分析指令的含义。指令具有的含义,说白了就是从数据区内的某处取出某数据,进行若干处理,然后写回某处。
处理器模型是所有事件的发起者,是不折不扣的主角。一般来说,它会从指令池的0地址开始取第一条指令,然后执行,下一次再取第二条,如果不遇见跳转指令,它会一直取到指令池的结束。而跳转指令会改变指令池的读取程序,强行它从某某地址重新开始读指令,然后一直递增,直到遇到下一条跳转指令。
好了,处理器开始读取指令。那么它首先得告诉指令池,它要取哪一条指令,不然指令池会出错。因此处理器会送给指令池一条地址信息,32位处理器的地址信息是32位宽的,因此指令池在理论上可以存放232个指令数据,也就是常说的4GB的地址空间。当然这4GB并非专属于指令池,通常的做法是:让指令池和数据池共用同一地址空间。8051作为8位处理器,地址线的宽度应该是8位,但其实不是,它的地址位宽是16位,因此指令的最大空间是216,也就是64KB的地址空间。它和32位处理器不同的是这64KB的空间乃属于指令池专用。
处理器对指令池给出地址,声明需提取指令池的xx地址的指令。指令池给出对应指令A,处理器把指令A放置于它的“当前执行的指令”区域,作为这次操作的主题。指令A的操作一般分为3步:第一步,从数据池的xx地址处取出数据,放于“当前处理的数据”区域;第二步,对“当前处理的数据”进行数据处理,最终改变成想要的形式;第三步,告诉数据池,某数据写回yy地址。上述三步完成,该指令即执行完毕,换下一条指令到“当前执行的指令”区域,重复上面的三步操作,如此周而复始。
每条指令的执行效果可能非常微小,但汇聚在一起就是一件有意义的行为。众所周知,指令池由开发软件编译而成,而开发软件编译的基础是C语言程序或汇编。这些C语言程序或汇编是由开发者编写的,并反映着开发者的意图。开发者也就是通过“C语言程序->开发软件->BIN文件->指令池内容”这条线来体现自己的意图的。软核处理器作为最低等的“生物”,它只是机械地按照指令池的内容进行执行,如此而已。
我们经常说8051处理器是8位的,它指的是指令池和数据池的位宽。每次从8051的指令池里取指令,都是以8位为基础的,但指令并非是8位的,而是参差不齐的。有的指令长一点,有3个字节;有的指令稍短,只有1个字节。8051处理器取出这些长短不一的指令,并解析执行之。