《程序是怎样跑起来的》读书笔记(一)CPU是什么
前言
想对计算机系统做些深入了解
故整了几本书翻翻
这里做个记录
从《程序是怎样跑起来的》开始
本节是第一章
CPU是什么
1、CPU内部结构
CPU(central processing unit)四个部分
- 寄存器:暂存指令、数据等处理对象,一般有20-100个
- 控制器:把内存上的指令、数据等读入寄存器
- 运算器:运算从内存读入寄存器的数据
- 时钟:发出CPU 开始计时的时钟信号
程序是指示计算机每一步动作的一组指令,在内存中运行
CPU负责程序的解释和运行:
- 程序启动后,根据时钟信号,控制器会从内存中读取指令和数据
- 通过对这些指令加以解释和运行,运算器就会对数据进行运算,控制器根据该运算结果来控制计算机
2、CPU是寄存器的集合
我们需要关注的是寄存器,因为程序是把寄存器作为对象来描述的
80386以上的CPU用的是汇编语言
寄存器的主要种类:
- 累加寄存器(accumulator register):存储执行运算的数据和运算后的数据
- 标志寄存器(flag register): 存储运算处理后的CPU 的状态
- 程序计数器(program counter): 存储下一条指令所在内存的地址
- 基址寄存器(base register) :存储数据内存的起始地址
- 变址寄存器(index register) :存储基址寄存器的相对地址
- 通用寄存器(general purpose register): 存储任意数据
- 指令寄存器(instruction register):存储指令,CPU 内部使用,程序员无法通过程序对该寄存器进行读写操作
- 栈寄存器(stack register): 存储栈区域的起始地址
3、程序计数器
将123 和456 两个数值相加,并将结果输出到显示器上的流程如下:
- 地址0100 是程序运行的开始位置
- 操作系统把程序从硬盘复制到内存后,会将程序计数器设定为0100
- CPU 每执行一个指令,程序计数器的值就会自动加1
- CPU 的控制器就会参照程序计数器的数值,从内存中读取命令并执行
4、条件分支和循环机制
程序流程
- 顺序执行:按照地址内容的顺序执行指令
- 条件分支:根据条件执行任意地址的指令
- 循环:重复执行同一地址的指令。
条件分支和循环会将程序计数器的值设定为任意地址
以条件分支为例如下:
作比较的流程:
- 比较累加寄存器中存储的XXX 值和通用寄存器中存储的YYY
- 进行XXX-YYY 的减法运算
- 运算的结果保存到标志寄存器中
- 结果为正表示XXX 比YYY 大,零表示XXX 和YYY 相等,负表示XXX 比YYY 小
5、函数的调用机制
函数调用的例子如下图
- 函数调用使用的是call 指令,而不是跳转指令
- 在将函数的入口地址设定到程序计数器之前, call 指令会把调用函数后要执行的指令地址存储在名为栈的主存内
- 函数处理完毕后,再通过函数的出口来执行return 命令
- return 命令的功能是把保存在栈中的地址设定到程序计数器中
6、通过地址和索引实现数组
实际地址 = 基址寄存器 + 变址寄存器
7、CPU的处理指令
机器语言指令类型
- 数据转送指令:寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作,如mov
- 运算指令:用累加寄存器执行算术运算、逻辑运算、比较运算和移位运算,如add
- 跳转指令:实现条件分支、循环、强制跳转等,如jmp
- call/return 指令:函数的调用/ 返回调用前的地址
结语
简单清晰的了解了CPU的工作流程