程序计数器
程序计数器(英语称为:Program counter),是CPU内的一个寄存器,存储的是将要执行的下一条指令的地址,所以通常也叫做指令计数器。或在某些电脑中称为指令指标(Instruction Pointer),指令指标都是在提取程式指令后就被立即增加,用来指示电脑正在执行的指令序列。依照特定机器的细节而不同,他可能是保存著正在被执行的指令,也可能是下一个要执行指令的地址。
程式计数器在每个指令周期会自动地增加,所以指令会正常地从寄存器中连续地被取出。某些指令,像是跳跃和子程序呼叫,会中断程序执行的序列,将新的数值内容存放到程序计数器中。也就是说跳跃指令的目的位址,是由跳跃指令的算子加上跳跃指令之后下一个指令的位址 (位元或字节,是电脑形态而定) 来获得目的地。程序计数器(PC)当执行指令时,CPU将自动修改PC的内容,以便使其保持的总是将要执行的下一条指令的地址。所以说上面的“这个量”是指的上一条指令的长度,执行完后要确定下一条指令的地址,就得增加已经执行的指令的长度。
程序计数器的工作过程
程序计数器PC的工作过程,是受CPU控制的。
复位时,PC = 0000H。
复位结束后,CPU按照PC的内容,到ROM中去取指令,每取出一个字节,就把PC的内容加一。
程序计数器
为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。
但是,当遇到转移指令如JMP指令时,后继指令的地址(即PC的内容)必须从指令寄存器中的地址字段取得。在这种情况下,下一条从内存取出的指令将由转移指令来规定,而不像通常一样按顺序来取得。因此程序计数器的结构应当是具有寄存信息和计数两种功能的结构。
程序计数器的作用
程序计数器(PROGRAM COUNTER)是一个二进制16位的程序地址寄存器,专门用来存放下一条需要执行的指令在程序存储器中的地址,能自动加1。CPU执行指令时,它根据程序计数器(PC)中的地址从程序存储器中取出当前需要执行的指令码,并把它送给控制器分析执行,随后程序计数器(PC)中地址码自动加1,以便为CPU取下一条需要执行的指令码作准备。当下一个指令字节取出执行后,PC又自动加1,这样,程序计数器一次次加1,指令就被一个字节一个字节地执行。所以,需要执行程序的机器码必须在程序执行前预先一条条地按顺序放到程序存储器中,并为程序计数器设置成程序第一条指令的内存地址。8051程序计数器由16个触发器构成,故它的编码范围为0000H~0FFFFH,共64KB。
“程序计数器PC”是否属于“通用寄存器”
在8086上它不是通用寄存器,因为不能通过mov等普通指令来操作,只能通过跳转指令等操作。
在ARM上不一样,它是可以通过普通的LDR指令来赋值(当然会导致程序跳转),所以可以归为通用寄存器。在arm中,PC寄存器的另外一个名称是r15,即15号寄存器。所以,在LDR pc,***等指令的机器码中,表示PC寄存器的比特代号是01111(5位二进制数。5个比特的不同组合可以区分32个寄存器)。
其实通用和专用寄存器的区分不是那么严格,不必深究,关键是要弄清可操作该寄存器的指令集合。
总之,指令计数器也就是程序计数器,它们在CPU内是同种寄存器的,相信大家通过今天的讲解应该都懂得了程序计数器的内容了吧,但学海无涯,希望大家能积极汲取程序计数器先进的知识,因为这样才能在这激烈的社会竞争中立于不败之地。
浏览过本文的人也浏览了:
什么叫cpu
http://baike.cntronics.com/abc/1870
什么叫控制寄存器?
http://baike.cntronics.com/abc/4842
控制器的作用
http://baike.cntronics.com/abc/1050