IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 大话程序猿眼中的CPU -> 正文阅读

[嵌入式]大话程序猿眼中的CPU

CPU 是英文 Central Processing Unit(中央处理器)的缩写,相当于计算机的大脑,它的内部由数百万至数亿个晶体管构成,这些都是大家所熟知的。不过,对 CPU 的了解如果只限于此的话,对编程是没有任何帮助的。程序员还需要理解 CPU 是如何运行的,特别是要弄清楚负责保存指令和数据的寄存器的机制。了解了寄存器,也就自然而然地理解了程序的运行机制。

下面是程序运行的流程图:
在这里插入图片描述
CPU 所负责的就是解释和运行最终转换成机器语言的程序内容

CPU内部结构

CPU内部由寄存器、控制器、运算器和时钟四个部分构成,各部分之间由电流信号相互连通。

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

在这里插入图片描述
程序启动后,根据时钟信号,控制器会从内存中读取指令和数据。通过对这些指令加以解释和运行,运算器就会对数据进行运算,控制器根据该运算结果来控制计算机。看到“控制”一词时,大家可能会将事情想象得过于复杂,其实所谓的控制就是指数据运算以外的处理(主要是数据输入输出的时机控制)。

CPU是寄存器的集合体

CPU 的四个构成部分中,程序员只需要了解寄存器即可,其余三个都不用太过关注。那么,为什么必须要了解寄存器呢?这是因为程序是把寄存器作为对象来描述的

汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言指令都会有一个与其相应的助记符,助记符通常为指令功能的英语单词的简写。例如,mov 和 add 分别是数据的存储(move)和相加(addition)的简写。汇编语言和机器语言基本上是一一对应的。这一点和 C 语言、Java 语言等高级编程语言 C 有很大不同。机器语言级别的程序是通过寄存器来处理的。也就是说,在程序员看来“CPU 是寄存器的集合体”。 使用高级语言编写的程序会在编译后转化成机器语言,然后再通过 CPU 内部的寄存器来处理。

寄存器中存储的内容既可以是指令也可以是数据。其中,数据分为“用于运算的数值”和“表示内存地址的数值”两种。数据种类不同,存储该数值的寄存器也不同。CPU 中每个寄存器的功能都是不同的。用于运算的数值放在累加寄存器中存储,表示内存地址的数值则放在基址寄存器和变址寄存器中存储。

在这里插入图片描述
其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。

程序猿眼中的CPU:

在这里插入图片描述

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

在对CPU有了一个大体印象后,接下来我们看一下程序是如何按照流程来运行的。

地址 0100 是程序运行的开始位置。Windows 等操作系统把程序从硬盘复制到内存后,会将程序计数器(CPU 寄存器的一种)设定为0100,然后程序便开始运行。CPU 每执行一个指令,程序计数器的值就会自动加 1。例如,CPU 执行 0100 地址的指令后,程序计数器的值就变成了 0101(当执行的指令占据多个内存地址时,增加与指令长度相应的数值)。然后,CPU 的控制器就会参照程序计数器的数值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程。

在这里插入图片描述

条件分支和循环机制

程序的流程分为顺序执行、条件分支和循环三种。顺序执行是指按照地址内容的顺序执行指令。条件分支是指根据条件执行任意地址的指令。循环是指重复执行同一地址的指令。

顺序执行的情况比较简单,每执行一个指令程序计数器的值就自动加 1。但若程序中存在条件分支和循环,机器语言的指令就可以将程序计数器的值设定为任意地址(不是 +1)。这样一来,程序便可以返回到上一个地址来重复执行同一个指令,或者跳转到任意地址。

随着程序计数器数值的增加,当到达 0102 地址时,如果累加寄存器的值是正数,则执行跳转指令(jump 指令)跳转到 0104 地址。此时,由于累加寄存器的值是 123,为正数,因此 0103 地址的指令被跳过,程序的流程直接跳转到了 0104 地址。也就是说,“跳转到 0104 地址”这个指令间接执行了“将程序计数器设定成 0104 地址”这个操作。

在这里插入图片描述
条件分支和循环中使用的跳转指令,会参照当前执行的运算结果来判断是否跳转。无论当前累加寄存器的运算结果是负数、零还是正数,标志寄存器都会将其保存(也负责存放溢出和奇偶校验的结果 )。CPU 在进行运算时,标志寄存器的数值会根据运算结果自动设定。条件分支在跳转指令前会进行比较运算,其实程序中的比较指令,就是在 CPU 内部做减法运算,得数为正就是被减数大,以此类推。至于是否执行跳转指令,则 由 CPU 在参考标志寄存器的数值后进行判断。运算结果的正、零、负三种状态由标志寄存器的三个位表示

在这里插入图片描述

函数的调用机制

哪怕是高级语言编写的程序,函数调用处理也是通过把程序计数器的值设定成函数的存储地址来实现的。不过,这和条件分支、循环的机制有所不同,因为单纯的跳转指令无法实现函数的调用。函数的调用需要在完成函数内部的处理后,处理流程再返回到函数调用点(函数调用指令的下一个地址)。因此,如果只是跳转到函数的入口地址,处理流程就不知道应该返回至哪里了。(需要一个回到原本主程序的方法)

函数调用使用的是 call 指令,而不是跳转指令。在将函数的入口地址设定到程序计数器之前,call 指令会把调用函数后要执行的指令地址存储在名为栈的主存内。函数处理完毕后,再通过函数的出口来执行 return 命令return 命令的功能是把保存在栈中的地址设定到程序计数器中。如图 1-7 所示,MyFunc 函数被调用之前,0154 地址保存在栈中。MyFunc 函数的处理完毕后,栈中的 0154 地址就会被读取出来,然后再被设定到程序计数器中。(这其实就是单片机执行中断函数前保护现场和保护断点的操作,这个寄存器相当重要。)

在这里插入图片描述

在编译高级编程语言的程序后,函数调用的处理会转换成 call 指令,函数结束的处理则会转换成 return 指令。 这样一来,程序的运行也就变得非常流畅。

通过地址和索引实现数组

首先,我们用十六进制数 B将计算机内存上 00000000~FFFFFFFF的地址划分出来。那么,凡是该范围的内存区域,只要有一个 32 位的寄存器,即可查看全部的内存地址(绝对地址)。但如果想要像数组那样分割特定的内存区域以达到连续查看的目的,使用两个寄存器会更方便些。 例如,查看 10000000 地址~1000FFFF 地址时,可 以 将 10000000 存入基址寄存器,并使变址寄存器的值 在00000000~0000FFFF 变化。CPU 则会把基址寄存器+变址寄存器的值解释为实际查看的内存地址。变址寄存器的值就相当于高级编程语言程序中数组的索引功能(相对地址)。

在这里插入图片描述

总结

下面按照功能对 CPU能执行的机器语言指令进行了大体分类。看完表后你会惊奇地发现,原来 CPU 可以进行的处理非常少。 虽然高级编程语言编写的程序看起来非常复杂,但CPU实际处理的事情就是这么简单!

在这里插入图片描述

?
本文内容属于笔记,大部分内容源自《程序是怎样跑起来的》这本书, 非常推荐大家去阅读原书!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:42:18  更:2022-07-21 21:43:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 18:02:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计