程序执行的基本概念
以基本概念来解释:微处理器有运算器和译码器,只要译码器能吃进指令,运算器能吃进数据,就能输出结果,这样微处理器就是执行了程序。话虽如此简单,实际上微处理器要能稳定的自动的做到这一点,是相当不容易的。远古时期的机械式计算机(严格意义只能叫计算器),想要做到足够精度的零件来保证这个稳定性就做不到。现代的微处理器已经用上了先进的纳米工艺,还有一大堆严密的数理化科学逻辑为后盾精心指导的半导体纳米工程制造,才满足了微处理器的各个部件的误差在可接受范围内。即便如此,逻辑电路的逻辑同步还是离不开一个重要的条件——时钟,一个周期稳定可靠的时钟是所有同步逻辑电路的同步关键。微处理器必须按时钟节拍一口一口(这里的一口就是一个时钟周期)吃进指令,吃进数据,再一口一口的输出结果。根据微处理器的设计不同,各个环节(比如指令执行环节)所需的时钟数都可能不同。不仅是微处理器,计算机中所有的逻辑电路都必须按时钟节拍计数进行逻辑同步。
微处理器所用时钟的一个周期时间,也就是时钟频率,是考量微处理器性能的重要指标。可以说时钟频率和运算位宽就是微处理器性能的两个重要指标。如果有个程序对这两个指标的要求不高,那么这个程序还考验不了微处理器的高性能,可倘若有个程序对这两个指标的要求高,不同微处理器的性能就能立见高低。
译码器和运算器从哪里吃到指令或数据?
微处理器一般有专门放指令和数据的寄存器,这些寄存器都是可用指令控制读写的,各种微处理器的这些寄存器有些细节上的不同,大部分是类似的。放指令所在地址的寄存器通常称为PC指针(PC是programcounter的缩写,这里不要误会成personal computer的缩写),programcounter硬生生翻译成中文就是“程序计数器”或“编程累加器”。
指针的概念就是:有个寄存器(或缓存)里存的数据一定是当地址去使用,而该地址上存的数据就是最终被用到的,一定是有某种方式能让微处理器根据这个寄存器(或缓存)里存的地址去取地址上的数据,这种寄存器(或缓存)就是指针。说白了就是能存地址的缓存,还能有办法让微处理器用这个缓存取到那个地址上的数据,这个缓存就成了指针。
通过PC指针可以把取到的指令喂给译码器,如果该指令不能被译码器识别,译码器就会报错。总之,该指令寄存器,也叫PC指针,或叫程序计数器,译码器总是根据该寄存器里的数据作为地址而去该地址上取指令。依照特定微处理器的细节而不同,PC指针可能是保存著正在被执行的指令,也可能是下一个要执行指令的地址。PC指针的位宽往往和译码器的位宽相等。
这个指令寄存器(PC指针)不仅能给译码器传入所指向的指令,还能在指令执行完之后自动递加所存的地址值,这样就能自动执行下一条指令从而按地址顺序一条条自动执行各个地址上的指令。
这个指令寄存器不自动递加地址的例外可以有多种情况,目前常见的有4种:
一是执行了一个跳转到另一地址的指令;
二是被指令直接改写了PC指针的值;
三是微处理器响应异常(这里异常的概念是中断,或者执行了未定义指令,或者是数据超范围之类的逻辑错误),PC指针又自动跳转到某指定的地址上;
四是微处理器电流或电压异常(这里异常的概念是没有规律或逻辑,纯属胡乱的错误)导致PC指针出错(这种出错一般叫跑飞)。
需要注意的是,PC指针自动递加的概念是,假如指令所占的地址是4字节,那么PC指针里的值每次递加4字节,假如指令所占的地址是2字节,那么PC指针里的值每次递加2字节,以此类推,PC指针里的值每次递加的值是按指令所占地址长度为准。
若想对PC指针的概念有更深入准确的理解,推荐仔细阅读http://en.wikipedia.org/wiki/Program_counter。
放数据的寄存器一般有多个,名字各有千秋,这些数据寄存器里的数据就喂给了运算器,至于这些寄存器怎么喂给运算器,运算器又如何处理这些数据就全看PC指针指向的指令了。译码器会把PC指针里的地址上所存的数据解码为相应的逻辑操作,根据指令可能会动用运算器里相应的某部分逻辑电路来实现数据的运算和赋值。
微处理器如何执行程序?
微处理器如何执行程序换句话说就是都有什么样指令给PC指针执行,所以这个问题得先从指令说起。具体微处理器的架构不一样,指令概念和意义也不一样,往往微处理器厂家给出的指令分类也不一样,像CISC(复杂指令集计算机)和RISC(精简指令集计算机)两大类CPU架构的指令集就颇有差异,许多微机原理的教科书以intel 8086为标杆介绍指令及指令分类,实际有些过时和以偏概全。
程序员要想熟悉某种微处理器的执行程序细节,指令是不可回避的一课。这些指令按逻辑一条条码好,就写成了汇编。汇编指令才是微处理器执行后有确切结果的代码,而在汇编指令之上的高级语言C/C++都不能说是执行结果确切,因为C/C++代码都可能被编译器编译优化出略有不同的汇编指令。
指令分类没必要太细,笼统的分清指令概念和脉络即可,不论CISC和RISC,指令大致有如下几类:1. 运算类指令;2. 值比较类指令;3.寻址跳转类指令;4. 赋值传送类指令;5. 特殊控制类指令;6. 协处理器扩展类指令。
运算类泛指“加、减、乘、除”算术类和“与、或、非、移位、位操作”逻辑类等等运算。值比较类泛指两数比大小。寻址跳转类泛指各种有或无条件的地址跳转。赋值传送类泛指寄存器之间的值传递和内存与寄存器之间的值传输。特殊控制类则各种微处理器都各有独特之处。协处理器是指一些微处理器用额外的大规模逻辑电路来强化某特定的功能,因此往往在原有指令基础上新添一套协处理器指令。
除寻址跳转指令外,还有一类特殊情况会让PC指针发生跳转,这类特殊情况通常是由硬件逻辑控制的跳转,一般微处理器厂商称这类情况叫exception(中文翻成异常),中断是异常情况的一种,如果送的指令或数据超出了微处理器的处理范围,也都属于异常情况。
异常发生后,微处理器一般能自动备份异常发生前一刻的关键寄存器到备份空间比如备份寄存器或堆栈,并且自动有相应的一些处理器状态及其寄存器的改变,然后将PC指针的地址自动(这里的自动指的是不需要软件参与)切到指定的地址。而在微处理器自动处理异常之后,也就是在PC指针被切到特定地址之后,后续的异常处理根据情况就可能要由软件来继续完成,所以特定地址上的程序就必须按微处理器设计的规范来写,否则相应的异常处理程序就无法继续正常执行完。
程序员需要对微处理器有什么样的理解?
微处理器除了有PC指针,数据寄存器,一般还设计有堆栈寄存器,状态寄存器,以及某些高级控制寄存器等。这些寄存器的位宽往往和该微处理器的运算器位宽一样,比如32位微处理器中PC指针,数据寄存器,堆栈寄存器等等都是32位,具体细节也可能随微处理器的不同而不同,这些细节会在该微处理器的数据手册中详细说明。
堆栈寄存器(英文是stack pointer)的数据也是个地址,该寄存器可以被指令直接读写,但这个寄存器最重要的功能,是执行某些指令,将一些指定的数据以堆栈的形式写到指定的一些连续地址上去。堆栈的概念就是数据存储与读写到地址上的顺序是按先入后出的顺序(换个说法也叫后进先出的顺序),如果有一串数据要写到一片地址上,只要这片地址的顺序定了,那么先写入的数据一定是排在这片地址的开头(这个地址头也叫栈底),后写入的数据排在这片地址的末尾(这个地址尾也叫栈顶),如果要取回这片数据,一定是从这片的地址末尾开始取,最先取回最后写入的数据,最后才能取到最先写入的数据。堆栈寄存器再匹配上压栈(或叫推入,英文是push)和出栈(或叫弹出,英文是pop)两种专业指令,就实现了堆栈的概念。当软件使用push指令时,被push的数据就存入了堆栈寄存器里存的那个地址上,并且该堆栈寄存器里的地址值会自动变为下一个顺序地址;当软件使用pop指令时,堆栈寄存器里存的那个地址上的数据就会自动被读出,堆栈寄存器里的地址值会自动变为上一个顺序地址。根据不同微处理器的设计,压栈的地址顺序可能是递加,也可能是递减,另外可以肯定的是,push或pop的数据可以只有一个,也可以有一串,在push或pop指令执行之后,堆栈寄存器中的值一定是连续的自动递加或递减。
堆栈寄存器是专门给软件使用的,这样软件就可以利用微处理器的堆栈寄存器动态的反复使用同一片连续存储空间,这片存储空间就叫堆栈空间。在软件运行过程中,软件的很多临时数据都可以往堆栈中塞,可节省很多存储空间。堆栈的大小以及堆栈所在的地址范围都由软件决定,当软件给堆栈寄存器赋值时,就叫初始化堆栈。如果软件设计的有漏洞(计算机软硬件的问题或者漏洞都叫bug),导致堆栈寄存器中的值超出了软件设计的堆栈地址范围,就可能错误的改写了堆栈之外的地址上数据,最终使用该数据的程序就很可能出错,这种错误一般叫堆栈溢出。大多数的微处理器对这种错误是不会管的(不排除有少数微处理器再设计些额外的硬件电路来管理堆栈寄存器),通常微处理器对这种错误既不报错也不提示,需要程序员自想办法查,然后改软件来解决。
状态寄存器或控制寄存器一般用来切换微处理器的内部功能或状态,从而达到让软件控制微处理器的某些处理功能或者说是解码功能。比如状态寄存器可以控制微处理器处理指令的权限,在某种状态下,某些指令就不能执行,或者说执行的结果就和另一种状态下该指令的结果不同。一个现代意义的微处理器必须至少有两种状态来满足运行现代操作系统所需的系统权限管理。
有的微处理器为了在某些时候能自动保存某些寄存器的数据,还设计了一些备份寄存器来自动备份诸如PC指针,状态寄存器等等。在执行某些指令的时候,PC指针或状态寄存器里的数据,会根据实际需要选择相应的寄存器由硬件做自动拷贝到相应的备份寄存器。比如保存PC现场到堆栈的概念就是把PC指针和数据寄存器里的一些数据全部拷贝进堆栈。
程序员基于上述的基本理解,在学习具体的微处理器都会有较好的基础,届时学习和理解的效率都会不错。
程序执行基于微处理器的译码器和运算器,通过程序计数器(PC指针)自动或手动递增来顺序执行指令。时钟频率和运算位宽是衡量微处理器性能的关键。异常处理包括中断和未定义指令等情况,会导致PC指针跳转到特定地址。程序员需要理解微处理器的指令系统、堆栈和状态寄存器等概念。

1248

被折叠的 条评论
为什么被折叠?



