程序计数器
编辑程序计数器 (PC),在 Intel x86 和 Itanium 微处理器中通常称为指令指针 (IP),有时也称为指令地址寄存器 (IAR)、指令计数器或只是指令序列器的一部分,是一个处理器寄存器,它 指示计算机在其程序序列中的位置。
通常,PC 在获取指令后递增,并保存(指向)下一条将要执行的指令的内存地址。
处理器通常按顺序从内存中获取指令,但控制传输指令通过在 PC 中放置一个新值来改变顺序。 这些包括分支(有时称为跳转)、子程序调用和返回。 以某些断言为真为条件的传输让计算机在不同条件下遵循不同的顺序。
分支规定下一条指令是从内存中的其他地方获取的。 子程序调用不仅是分支,而且还把PC 的前面的内容保存在某处。 返回检索 PC 中保存的内容并将其放回 PC 中,恢复顺序执行子程序调用后的指令。
硬件实现
编辑在一个简单的中央处理器 (CPU) 中,PC 是一个数字计数器(它是术语程序计数器的来源),它可能是几个硬件寄存器之一。 指令周期以取指开始,其中 CPU 将 PC 的值放在地址总线上以将其发送到内存。 存储器通过在数据总线上发送该存储器位置的内容来响应。 (这是存储程序计算机模型,其中单个内存空间包含可执行指令和普通数据。)在获取之后,CPU 继续执行,根据它获得的内存内容采取一些行动。 在这个周期的某个时刻,PC 将被修改,以便下一条执行的指令是不同的(通常,递增以便下一条指令是从紧跟在当前指令的最后一个内存位置之后的内存地址开始的指令) .
与其他处理器寄存器一样,PC 可能是一组二进制锁存器,每个锁存器代表 PC 值的一位。 位数(PC 的宽度)与处理器架构有关。 例如,“32 位”CPU 可能使用 32 位来寻址 232 个内存单元。 在某些处理器上,程序计数器的宽度取决于可寻址内存; 例如,一些 AVR 控制器有一个 PC,它在 12 位后回绕。
如果 PC 是一个二进制计数器,当一个脉冲被应用到它的 COUNT UP 输入时它可能会递增,或者 CPU 可能会计算一些其他值并通过一个脉冲到它的 LOAD 输入将它加载到 PC 中。
为了标识当前指令,PC 可以与标识段或页的其他寄存器组合。 通过假设大多数感兴趣的存储单元都在当前附近,这种方法允许 PC 具有更少的位。
机器架构的后果
编辑使用通常递增的 PC 假设计算机所做的是执行通常线性的指令序列。 这样的 PC 是冯·诺依曼架构的核心。 因此,即使算法不必是顺序的,程序员也可以编写顺序控制流。 由此产生的“冯诺依曼瓶颈”导致了对并行计算的研究,包括非冯诺依曼或不使用 PC 的数据流模型; 例如,高级程序员可能会指定所需的功能,而不是指定顺序步骤,而低级程序员可能会使用组合逻辑来指定它。
这项研究还导致了使基于 PC 的传统 CPU 运行得更快的方法,包括:
高级编程的结果
编辑现代高级编程语言仍然遵循顺序执行模型,事实上,识别编程错误的一种常见方法是使用“过程执行”,其中程序员的手指像 PC 一样识别执行点。 高级语言本质上是虚拟机的机器语言,太复杂而不能作为硬件构建,而是通过软件模拟或解释。
然而,新的编程模型超越了顺序执行编程:
- 在编写多线程程序时,程序员可以将每个线程编写为指令序列,而无需指定任何指令相对于其他线程中指令的时序。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/195851/