概述
CPU之寄存器机制
1.CPU结构
CPU的内部由时钟、控制器、运算器、寄存器四个部分构成,各部分之间由电流信号相互连通。
- 时钟: 发出CPU运行时所需的时钟信号。不过,也有些计算机的时钟位于CPU的外部。
- 寄存器: 用来暂存指令、数据等处理对象。根据种类的不同,一个CPU内部会有20~100个寄存器。
- 控制器: 把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机。
- 运算器: 运算从内存读入寄存器的数据。
程序启动后,根据时钟信号,控制器会从内存中读取指令和数据。通过对这些指令加以解释和运行,运算器就会对数据进行运算,控制器根据该运算结果来控制计算机。
比如内存和磁盘等媒介的输入输出、键盘和鼠标的输入、显示器和打印机的输出等,这些都是控制的内容。
2.CPU是寄存器的集合体
通过阅读汇编语言编写的代码可知,程序是把寄存器当做对象来描述的。使用高级语言编写的程序会在编译后转化成机器语言,然后再通过CPU内部的寄存器来处理。
不同类型的CPU,其内部寄存器的数量、种类以及寄存器存储的数值范围都是不同的。不过,根据功能的不同,我们可以将寄存器大致划分为八类。
用于运算的数值放在累加寄存器中存储,表示内存地址的数值则放在基址寄存器和变址寄存器中存储。
其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。
程序员眼中的CPU:
3.决定程序流程的程序计数器
用户发出启动程序的指示后,Windows等操作系统会把硬盘中保存的程序复制到内存中。程序启动后内存内容模型:
Windows等操作系统把程序从硬盘复制到内存后,会将程序计数器设定为0100,然后程序便开始运行。CPU每执行一个指令,程序计数器的值就会自动加1。
然后,CPU的控制器就会参照程序计数器的数值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程。
4.条件分支与循环机制
首先,无论当前累加寄存器的运算结果是负数、零还是正数,标志寄存器都会使用三个位来表示:
条件分支和循环机制会先进行比较运算,然后参考标志寄存器的数值,达到某个条件后执行
跳转指令(jump)。
- 注: 程序中的比较指令,其实是在CPU内部做减法运算。
5.函数的调用机制
哪怕是高级语言编写的程序,函数调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。不过,这和条件分支、循环的机制有所不同,函数的调用需要在完成函数内部的处理后,处理流程再返回到函数调用点。因此,如果只是跳转到函数的入口地址,处理流程就不知道应该返回至哪里了。
机器语言的call指令和return指令能够解决这个问题。函数调用使用call指令,在将函数的入口地址设定到程序计数器之前,call指令会把调用函数后要执行的指令地址存储在名为栈的主存内。函数处理完毕后,再通过函数的出口来执行return命令。return命令的功能是把保存在栈中的地址设定到程序计数器中。
在编译高级编程语言的程序后,函数调用的处理会转换成call指令,函数结束的处理则会转换成return指令。这样一来,程序的运行也就变得非常流畅。
6.利用地址和索引实现数组
基址寄存器和变址寄存器。通过这两个寄存器,我们可以对主内存上特定的内存区域进行划分,从而实现类似于数组的操作。
例如,查看10000000地址~1000FFFF地址时,可以将10000000存入基址寄存器,并使变址寄存器的值在00000000~0000FFFF变化。CPU则会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能。
7.说明
本文为《程序是怎样跑起来的》读书笔记,如有错误,请兄弟们指正,大家一起进步!
最后
以上就是平淡往事为你收集整理的CPU之寄存器机制的全部内容,希望文章能够帮你解决CPU之寄存器机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复