《程序是怎样跑起来的》系列专栏-第1章 对程序员来说,cpu是什么

第1章 对程序员来说,cpu是什么

`热身准备
1.程序是什么?–简单来说,程序就是指令。在生活中所说的程序,如音乐会、运动会上的程序,表示“事情执行的先后顺序”,在计算机程序中也是一样,“表示cpu做事情的先后顺序”。
2.程序由什么组成?–指令和数据。如printf(“你好”);,printf就是指令,“你好”就是数据
3.什么是机器语言?cpu可以直接执行的语言,C语言,java等语言都要转成机器语言才能被cpu执行。
4.运行中的程序放在什么地方?–内存中。硬盘中的数据,都要复制到内存中才能运行。
5.什么是内存地址?–表示数据和指令在内存中存放位置的数值
6.在计算机部件中,负责对程序进行解释和执行的是什么?–cpu

其实当时在看这些问题时,是有些卡顿的,看来还是要多看看基础知识。

1.1 cpu的内部构造

1.程序运行时的流程:
高级语言被编译成机器语言,运行时,机器语言被拷贝到内存中,cpu从内存读取并执行。
从这里可以看出,cpu是对最终转换为
机器语言
的程序进行解释和执行的设备
在这里插入图片描述
**2.**cpu由寄存器、控制器、运算器、时钟组成,它们通过电流信号相互连通。

在这里插入图片描述
寄存器:存放指令、数据这些操作对象的空间。
控制器:将指令和数据读入寄存器,并根据指令执行结果对计算机进行控制
运算器:负责运算从内存中读入的寄存器的数据
时钟:产生cpu工作节律的时钟信号。
**3.**主存:通过控制电路与cpu相连,用于存储指令和数据。由一些可读可写的存储单元构成,每个字节都分配了一个地址编号。cpu通过地址可以读/写内存
程序运行原理:cpu根据时钟信号从内存中读取指令和数据,对指令进行解释和执行,运算器会根据解释和执行,对数据进行运算,控制器根据运算结果控制计算机进行指定的操作。

1.2 cpu是寄存器的集合体

寄存器是程序的描述对象-因为程序被编译成机器语言之后,在机器语言层面,程序的操作都是使用寄存器来完成的。如程序计数器和累加寄存器等。
表1-1列出了寄存器的类型
在这里插入图片描述
cpu是由不同功能的寄存器所构成的集合体,cpu通过这些寄存器的功能来解释和执行机器语言指令,所以从程序员的角度看,cpu是寄存器的集合体
在这里插入图片描述

1.3 决定程序流程的程序计数器

对cpu有了大致印象后,来看一下程序是如何按照指令的顺序来运行的。
地址 0100 是程序运行的开始位置。Windows 等操作系统把程序从硬盘复制到内存后,会将程序计数器(CPU 寄存器的一种)设定为0100,然后程序便开始运行。CPU 每执行一个指令,程序计数器的值就会自动加 1。例如,CPU 执行 0100 地址的指令后,程序计数器的值就变成了 0101(当执行的指令占据多个内存地址时,增加与指令长度相应的数值)。然后,CPU 的控制器就会参照程序计数器的数值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程.
在这里插入图片描述
cpu每执行完一条指令,程序计数器就自动加1,如果指令占了不只一个字节,则程序计数器会自动增加相应的长度。cpu的控制器会根据程序计数器的值从内存中读取指令并执行。

1.4 条件分支和循环的原理

程序流程有三种:顺序,分支,和循环
顺序就是按照地址的数值顺序执行指令。程序计数器的值每次加1即可。
条件分支就是按照条件执行任意地址的指令。
循环分支就是重复执行同一地址的指令。
如果存在条件和循环分支,指令可将程序计数器设置为任意地址,通过这样的方式,程序就可以返回之前的地址,重复执行指令,或者跳到任意地址,实现分支。
条件分支所使用的跳转指令根据前一条指令的运算结果判断是否进行跳转
图1-5 表示把内存中存储的数值(示例中是 123)的绝对值输出到
显示器的程序的内存状态。程序运行的开始位置是 0100 地址。随着程
序计数器数值的增加,当到达 0102 地址时,如果累加寄存器的值是正
数,则执行跳转指令(jump 指令)跳转到 0104 地址
。此时,由于累加
寄存器的值是 123,为正数,因此 0103 地址的指令被跳过
,程序的流
程直接跳转到了 0104 地址。也就是说,“跳转到 0104 地址”这个指令
间接执行了“将程序计数器设定成 0104 地址”这个操作
在这里插入图片描述
CPU进行比较的方式:
假设需要比较累加寄存器xxx和通用寄存器yyy的值,当执行比较指令时,cpu会在内部悄悄执行xxx- yyy减法运算,然后根据标志寄存器的值:如果为正,则说明xxx > yyy,如果为负,则说明xxx < yyy,如果为0,则表示xxx == yyyy。所以cpu进行比较的方式是通过减法来实现的。

标志寄存器:保存上一次运算的结果(正数/负数/0),cpu根据标志寄存器的值来判断是否进行跳转。32位cpu的标志寄存器如下图,使用3bit来表示正/负/0.
在这里插入图片描述

1.5 函数调用原理

程序对函数的调用,是通过将程序计数器(PC指针)的值设置为存放函数的地址来实现的。

如图所示,将a.b作为参数,调用MyFunc函数,调用MyFunc函数时,是通过跳转指令将程序计数器的值设置为地址0260来实现的。当执行到函数体的出口地址0354时,需要将程序计数器****的值设置为函数调用指令的下一条指令,即0154
在这里插入图片描述
要实现上述操作,需要使用调用指令和返回指令。函数调用时使用的不是跳转指令,而是调用指令,并且调用指令在将函数入口地址设置给程序计数器之前会将函数调用的下一条指令地址保存到栈里面去。函数执行完成后,会在最后(出口)执行返回指令。返回指令功能是将保存在栈中的地址设置给程序计数器。

在这里插入图片描述

1.6 用基址和变址实现数组

变址:相当于程序中数组的下标。

这个图一看就明白,cpu将基址寄存器和变址寄存器相加计算出实际的内存地址。
在这里插入图片描述

1.7 cpu的处理其实很简单

下表就是cpu能执行的指令功能,所以无论高级语言编写的程序多么复杂,cpu也就执行这四种操作。
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值