程序员需要了解的硬核知识之CPU( 二 )
所以计算机语言一般分为两种:低级语言(机器语言 , 汇编语言)和高级语言 。 使用高级语言编写的程序 , 经过编译转换成机器语言后才能运行 , 而汇编语言经过汇编器才能转换为机器语言 。
汇编语言首先来看一段用汇编语言表示的代码清单
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指向下一条要执行的指令 。
我们还是以一个事例为准来详细的看一下程序计数器的执行过程
文章插图
这是一段进行相加的操作 , 程序启动 , 在经过编译解析后会由操作系统把硬盘中的程序复制到内存中 , 示例中的程序是将 123 和 456 执行相加操作 , 并将结果输出到显示器上 。 由于使用机器语言难以描述 , 所以这是经过翻译后的结果 , 实际上每个指令和数据都可能分布在不同的地址上 , 但为了方便说明 , 把组成一条指令的内存和数据放在了一个内存地址上 。
地址 0100 是程序运行的起始位置 。 Windows 等操作系统把程序从硬盘复制到内存后 , 会将程序计数器作为设定为起始位置 0100 , 然后执行程序 , 每执行一条指令后 , 程序计数器的数值会增加1(或者直接指向下一条指令的地址) , 然后 , CPU 就会根据程序计数器的数值 , 从内存中读取命令并执行 , 也就是说 , 程序计数器控制着程序的流程 。
条件分支和循环机制我们都学过高级语言 , 高级语言中的条件控制流程主要分为三种:顺序执行、条件分支、循环判断三种 , 顺序执行是按照地址的内容顺序的执行指令 。 条件分支是根据条件执行任意地址的指令 。 循环是重复执行同一地址的指令 。
- 顺序执行的情况比较简单 , 每执行一条指令程序计数器的值就是 + 1 。
- 条件和循环分支会使程序计数器的值指向任意的地址 , 这样一来 , 程序便可以返回到上一个地址来重复执行同一个指令 , 或者跳转到任意指令 。
文章插图
程序的开始过程和顺序流程是一样的 , CPU 从0100处开始执行命令 , 在0100和0101都是顺序执行 , PC 的值顺序+1 , 执行到0102地址的指令时 , 判断0106寄存器的数值大于0 , 跳转(jump)到0104地址的指令 , 将数值输出到显示器中 , 然后结束程序 , 0103 的指令被跳过了 , 这就和我们程序中的 if() 判断是一样的 , 在不满足条件的情况下 , 指令会直接跳过 。 所以 PC 的执行过程也就没有直接+1 , 而是下一条指令的地址 。
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 联网时代|34岁转行做程序员是否还有成功的机会
- 人类|距离人类“玩坏”自己的电脑桌面,还需要多久?
- 加急|古代8百里加急究竟有多快?需要骑马20个小时,速度媲美顺丰快递!
- 双行合一|关于Word我们要了解的知识(12)
- 模式|刚了解到无货源电商模式,淘宝好还是抖音小店好?
- 移植|开发者将移植ARM Mac的Linux系统 但需要得到资金支持
- 微信|微信转账点收款就能收到钱了?这个“秘密”要了解,很多人上当了
- 5D封装|EDA365:先进IC封装,你需要知道的几大技术
- 靴子|美团需要新靴子