1.汇编语言的本质

cpu指中央处理器。
电脑或服务器(服务器是一种性能更为强劲的电脑)用的cpu一般是intel架构的(复杂指令集);嵌入式产品用的cpu一般是ARM公司设计的ARM架构的(精简指令集)。

复杂嵌入式产品(譬如手机,平板,智能电视,机顶盒等)里面的cpu也被称为SoC(system on chip),即一个最小系统在一个芯片上,最小系统包含了(内存:iRAM,外存:iROM)以及各种基础的片上外设(譬如串口,看门狗等),它一般是多核的。

简单嵌入式产品里面的cpu一般是MCU,微控制器,它一般是单核的,主频和内存以及外存flash都比SoC更小。

各种cpu本质上都是一块芯片,芯片本质上都是一块电路板,只不过该电路板的尺寸非常小,按照现在的集成工艺,一块单片机里面大概有十亿个电子管(二极管,三极管等)。这些电子管经过各种组合,组合成了各种模块化电路,每一个模块的组合逻辑电路都实现了相应的功能。

例如,减法逻辑组合电路实现了减法的功能,左移电路实现了左移的功能。每一个功能都是一个接口,我们使用减法只要调用对应的功能接口就可以了。这些接口就是机器码(机器码是0101的二进制,其本质就是组合逻辑电路的开关,和我们房间里灯的开关是一样的)。而汇编指令仅仅是这些机器码/二进制的助记符。也就是一条汇编指令一定有一条和它对应的机器码。

因为不同架构的cpu都是不同公司设计的,所以他们内部的组合逻辑电路的实现方式不同,也就是每个功能其对应的机器码不同,机器码不同功也就是汇编指令不同。所以才说,不同架构的cpu有不同的汇编指令。用arm汇编指令写的程序不能运行在intel架构的cpu中

总结:
可以将汇编语言看是应用开发中的API接口,这个API接口的具体实现就是一堆组合逻辑电路。汇编指令和机器码是一 一对应的关系。在一些需要执行效率的场所,例如操作系统调度模块一般才会用汇编语言来写,通常情况一般都是使用C语言来写。

2.程序的执行

一条指令的执行分为三个过程,即cpu的三级流水线;
当CPU要执行内存中的一条指令时,会依次经过以下三步:读取指令—>译码(CPU理解该指令)—>执行(理解完之后就是执行)。

三级流水线可以理解为有三条流水线,并且它们是各自独立的同步进行,所以在任何一个时刻都有一条指令正在执行,正在读取,正在译码。现在很多cpu是8级流水线或12级流水线的,流水线越多,cpu运行的速度就越快。

注:
stm32使用的是三级流水线。

3.程序具有可移植性的本质

汇编语言没有移植性,因为每种架构的cpu都有自己的机器码指令集。

C语言有一定的移植性,因为C语言要经过汇编器编译为汇编代码之后,再给cpu执行的,同一个C语言程序,只要经过不同的编译器(编译器里面包含了汇编器)编译,就能放到对应架构的cpu中运行。

譬如有arm汇编器和intel汇编器,C语言没有移植性,但是不同架构的cpu有对应的汇编器,所以使得C语言有了可移植性;就像java语言一样,java本身没有移植性,但是我们开发出了针对不同平台(操作系统)的JVM,同一个java程序要先运行在对应平台的JVM中,然后才能运行在具体的操作系统中,这也就变相得使java有了可移植性。

譬如我们常用的gcc编译器。gcc编译器有两种类型,一是针对intel cpu架构的编译器,我们就把它称为gcc编译器,另一种则是针对arm cpu架构的编译器,我们一般称它为arm-linux-gcc编译器。

做嵌入式Linux开发,搭建开发环境时,需要安装交叉编译工具链。这里安装的交叉编译工具链指的是arm-linux-gcc编译器,用这个arm-linux-gcc编译出来的C语言可执行文件只能放在开发板上运行。用gcc编译出来的C语言可执行文件也只能在电脑上运行。

4.复杂指令集(CISC)CPU和精简指令集(RISC)CPU的区别

复杂和精简体现在CPU指令的数量上;复杂指令集指该CPU有非常多的指令,精简指令集CPU的指令相对较少。

CISC架构的CPU指令集数量很多,它的设计理念是:使用最少的指令数来完成一个操作。譬如一个乘加(先乘后加)指令,在CISC架构的CPU中可能直接存在一条这样的乘加指令来完成乘加操作;但在RISC架构中,可能只提供乘法指令和加法指令,然后乘加操作要靠这两个指令结合来完成。

在CISC架构的CPU中一个操作可能就直接对应一条CPU指令,这就导致了CPU本身的设计变得十分复杂,因为一条指令的本质就是CPU内部的一堆数字电路,也正是因为数字电路一多就导致CPU的功耗很大。intel架构的cpu一般都是CISC的(这也说明整个行业最顶尖的人才还是在intel),这种CPU一般用在高性能的服务器中。

精简指令集架构就是CPU的指令的条数比较少,一般的Intel的CPU有300条指令,而RISC架构的CPU(譬如ARM)只有大概30条指令。RISC的设计理念是:通过提供最基本的30多条指令来完成各种复杂操作。RISC架构的CPU设计简单,芯片内部的组合逻辑电路更少,所以它功耗更低。典型的就是ARM架构的CPU。
  

5.哈佛架构和冯诺依曼架构的区别

(1)冯诺依曼结构
程序就是对数据的加工器。程序段一般只需要用来读,而不需要写(写程序段,就意味着把源代码给改了,这肯定是不允许的,代码是在编写的时候就已经确定的);而数据段里面的数据,往往需要被程序段的程序反复读写修改的。

在存储器中,程序段和数据段都是二进制的。基于此,冯诺依曼就提出,程序也是一种数据,所以就有了冯诺依曼结构,将程序段和数据段放在一起(具体在CPU内部怎么处理的可以不用管)。

在这种架构中,CPU对二进制的处理比较方便,因为不管是数据还是程序直接读进来就行了。但是,正是因为程序段和数据段放在了一起(交织在一起),使得程序在运行时,可能会将程序段中的程序误以为是数据,不小心将程序段给改了,导致程序奔溃。

所以这种架构的CPU一般用在桌面电脑中,因为即使出现这种错误,直接重启就好了,并不会造成致命的伤害。

(2)哈佛结构
哈佛结构是将数据和程序分开存放,当然在内存中,他们还是在一起的。一块内存中,可能这一部分是用来放数据的,另一部分是用来放程序的,这种划分通过操作系统来完成。

基于数据和程序分开放的哈弗结比较安全,因为不会出现自己踩到自己的错误,所以这种CPU一般用在嵌入式领域,因为嵌入式领域稳定性一般要求比较高。
  

6.通用寄存器和特殊功能寄存器的区别

通用寄存器指的是CPU内部的寄存器,譬如R0、R1等。通用寄存器里面存放什么数据由我们自己决定。

特殊功能寄存器属于SoC外设的一部分,相当于专门用来操作该外设的接口。arm的通用寄存器只有37个,但特殊功能寄存器多得数不清…
  

7.ARM体系架构总结

(1)arm是RISC结构的。
(2)arm是低功耗的。
(3)arm的结构非常适合单片机、嵌入式,尤其是物联网领域;服务器等高性能领域目前主导的还是intel。
(4)大部分arm都是32位架构的。譬如:
M3\M4\M0\ARM9\ARM11\A8\A9等。
(5)内存和特殊功能寄存器都是通过地址总线直线访问的,即IO与内存统一编址。

(6)arm是哈佛架构的。

注:

由于ARM架构的CPU(除ARM7之外)都是RISC架构的,并且ARM都是内存与IO统一编址的,这样就导致ARM实际用作内存的地址少于4G,也就是用来放数据和程序的地址空间是少于4G的,因为有一部分地址已经留给了IO外设对应的寄存器。