程序员需要了解的硬核知识之CPU( 二 )


CPU 是寄存器的集合体在 CPU 的四个结构中 , 我们程序员只需要了解寄存器就可以了 , 其余三个不用过多关注 , 为什么这么说?因为程序是把寄存器作为对象来描述的 。
说到寄存器 , 就不得不说到汇编语言 , 我大学是学信息管理与信息系统的 , 我就没有学过汇编这门课(就算有这门课也不会好好学hhhh) , 出来混总是要还的 , 要想作为一个硬核程序员 , 不能不了解这些概念 。 说到汇编语言 , 就不得不说到高级语言 , 说到高级语言就不得不牵扯出语言这个概念 。
计算机语言我们生而为人最明显的一个特征是我们能通过讲话来实现彼此的交流 , 但是计算机听不懂你说的话 , 你要想和他交流必须按照计算机指令来交换 , 这就涉及到语言的问题 , 计算机是由二进制构成的 , 它只能听的懂二进制也就是机器语言 , 但是普通人是无法看懂机器语言的 , 这个时候就需要一种电脑既能识别 , 人又能理解的语言 , 最先出现的就是汇编语言 。 但是汇编语言晦涩难懂 , 所以又出现了像是 C , C++ , Java 的这种高级语言 。
所以计算机语言一般分为两种:低级语言(机器语言 , 汇编语言)和高级语言 。 使用高级语言编写的程序 , 经过编译转换成机器语言后才能运行 , 而汇编语言经过汇编器才能转换为机器语言 。
汇编语言首先来看一段用汇编语言表示的代码清单
mov eax, dword ptr [ebp-8]/* 把数值从内存复制到 eax */add eax, dword ptr [ebp-0Ch] /* 把 eax 的数值和内存的数值相加 */mov dword ptr [ebp-4], eax /* 把 eax 的数值(上一步的结果)存储在内存中*/这是采用汇编语言(assembly)编写程序的一部分 。 汇编语言采用 助记符(memonic) 来编写程序 , 每一个原本是电信号的机器语言指令会有一个与其对应的助记符 , 例如 mov,add 分别是数据的存储(move)和相加(addition)的简写 。 汇编语言和机器语言是一一对应的 。 这一点和高级语言有很大的不同 , 通常我们将汇编语言编写的程序转换为机器语言的过程称为 汇编;反之 , 机器语言转化为汇编语言的过程称为 反汇编 。
汇编语言能够帮助你理解计算机做了什么工作 , 机器语言级别的程序是通过寄存器来处理的 , 上面代码中的 eax,ebp 都是表示的寄存器 , 是 CPU 内部寄存器的名称 , 所以可以说 CPU 是一系列寄存器的集合体 。 在内存中的存储通过地址编号来表示 , 而寄存器的种类则通过名字来区分 。
不同类型的 CPU, 其内部寄存器的种类 , 数量以及寄存器存储的数值范围都是不同的 。 不过 , 根据功能的不同 , 可以将寄存器划分为下面这几类
种类功能累加寄存器存储运行的数据和运算后的数据 。 标志寄存器用于反应处理器的状态和运算结果的某些特征以及控制指令的执行 。 程序计数器程序计数器是用于存放下一条指令所在单元的地址的地方 。 基址寄存器存储数据内存的起始位置变址寄存器存储基址寄存器的相对地址通用寄存器存储任意数据指令寄存器储存正在被运行的指令 , CPU内部使用 , 程序员无法对该寄存器进行读写栈寄存器存储栈区域的起始位置
其中程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个 , 其他寄存器一般有多个 。
程序员需要了解的硬核知识之CPU文章插图
程序计数器程序计数器(Program Counter)是用来存储下一条指令所在单元的地址 。
程序执行时 , PC的初值为程序第一条指令的地址 , 在顺序执行程序时 , 控制器首先按程序计数器所指出的指令地址从内存中取出一条指令 , 然后分析和执行该指令 , 同时将PC的值加1指向下一条要执行的指令 。
我们还是以一个事例为准来详细的看一下程序计数器的执行过程
程序员需要了解的硬核知识之CPU文章插图


推荐阅读