程序是怎么跑起来的笔记 -- CPU

1、程序是指示计算机每一步动作的一组指令,程序由指令和数据组成。

2、机器语言是CPU可以直接识别和使用的语言。

3、正在运行的程序存储在内存中。硬盘和磁盘等媒介上保存的程序被复制到内存后才能运行。

4、内存地址是在内存中,用来表示指令和数据存储位置的整数值。、

5、CPU负责程序的解释和运行,并控制整个计算机。

 

CPU 的内部由寄存器、 控制器、 运算器和时钟四个部分构成, 各部分之间由电流信号相互连通。寄存器 可用来暂存指令、 数据等处理对象, 可以将其看作是内存的一种。 根据种类的不同, 一个 CPU 内部会有20~100 个寄存器。控制器 负责把内存上的指令、 数据等读入寄存器,并根据指令的执行结果来控制整个计算机。运算器 负责运算从内存读入寄存器的数据。 时钟 负责发出 CPU 开始计时的时钟信号 。 不过, 也有些计算机的时钟位于 CPU 的外部。

内存指的是计算机的主存储器( main memory), 简称主存。 主存通过控制芯片等与 CPU 相连,主要负责存储指令和数据。 主存由可读写的元素构成, 每个字节 都带有一个地址编号。 CPU 可以通过该地址读取主存中的指令和数据, 当然也可以写入数据。 但有一点需要注意, 主存中存储的指令和数据会随着计算机的关机而自动清除。内存的存储场所通过地址编号来区分, 而寄存器的种类则通过名字来区分。

程序启动后, 根据时钟信号, 控制器会从内存中读取指令和数据。 通过对这些指令加以解释和运行, 运算器就会对数据进行运算, 控制器根据该运算结果来控制计算机。所谓的控制就是指数据运算以外的处理( 主要是数据输入输出的时机控制)。 比如内存和磁盘等媒介的输入输出、 键盘和鼠标的输入、 显示器和打印机的输出等, 这些都是控制的内容

程序员只需要了解寄存器即可,程序是把寄存器 作为对象来描述的。机器语言级别的程序是通过寄存器来处理的。 也就是说, 在程序员看来“CPU 是寄存器的集合体”。使用高级语言编写的程序会在编译 后转化成机器语言, 然后再通过 CPU 内部的寄存器来处理。汇编语言采用助记符( memonic) 来编写程序, 每一个原本是电气信号的机器语言  指令都会有一个与其相应的助记符,助记符通常为指令功能的英语单词的简写。汇编语言和机器语言基本上是一一对应的。将汇编语言编写的程序转化成机器语言的过程称为 汇编; 反之, 机器语言程序转化成汇编语言程序的过程则称为 反汇编。

寄存器中存储的内容既可以是指令也可以是数据。 其中, 数据分为“用于运算的数值” 和“表示内存地址的数值” 两种。 用于运算的数值放在累加寄存器中存储, 表示内存地址的数值则放在基址寄存器和变址寄存器中存储。
启动程序,操作系统把程序从硬盘复制到内存后, 会将程序计数器设定为程序运行的开始位置,然后程序便开始运行。 CPU 每执行一个指令, 程序计数器的值就会自动加 1( 当执行的指令占据多个内存地址时, 增加与指令长度相应的数值)。然后, CPU 的控制器就会参照程序计数器的数值, 从内存中读取命令并执行。 也就是说, 程序计数器决定着程序的流程。

条件分支和循环中使用的 跳转指令, 会参照当前执行的运算结果来判断是否跳转。 无论当前累加寄存器的运算结果是负数、 零还是正数, 标志寄存器都会将其保存( 也负责存放溢出 和奇偶校验 的结果 )。CPU 在进行运算时, 标志寄存器的数值会根据运算结果自动设定。条件分支在跳转指令前会进行比较运算(比较运算的结果存储在标志寄存器的三个位中)。 至于是否执行跳转指令, 则由 CPU 在参考标志寄存器的数值后进行判断。 运算结果的正、 零、 负三种状态由标志寄存器的三个位 表示。 标志寄存器的第一个字节位、 第二个字节位和第三个字节位的值为 1 时, 表示运算结果分别为正数、零和负数。 如下图是 32 位 CPU 的标志寄存器的示例。

程序中的比较指令, 就是在 CPU 内部做减法运算。假设要比较累加寄存器中存储的 XXX 值和通用寄存器中存储的 YYY值, 执行比较的指令后, CPU 的运算装置就会在内部( 暗中) 进行XXX-YYY 的减法运算。 而无论减法运算的结果是正数、 零还是负数,都会保存到标志寄存器中。 结果为正表示 XXX 比 YYY 大, 零表示XXX 和 YYY 相等, 负表示 XXX 比 YYY 小。

函数调用使用的是 call 指令, 而不是跳转指令。在将函数的入口地址设定到程序计数器之前,call 指令会把调用函数后 要执行的指令地址( 函数调用指令的下一个地址)存储在名为栈  的主存内。函数处理完毕后, 再通过函数的出口来执行 return 命令。 return 命令的功能是把保存在栈中的地址设定到程序计数器中。

只要有一个 32 位的寄存器, 即可查看全部的内存地址。 但如果想要像数组那样分割特定的内存区域以达到连续查看的目的, 使用两个寄存器会更方便些。CPU 则会把基址寄存器+ 变址寄存器的值解释为实际查看的内存地址。 变址寄存器的值就相当于高级编程语言程序中数组的索引功能。

 


 


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值