iqoo neo5|关于CPU的12个硬核干货!( 二 )


05计算机语言
人和人之间最古老和直接的沟通媒介是语言 , 但是和计算机沟通 , 就必须按照计算机指令来交换 , 其中就涉及到语言的问题 。 最早 , 为了解决计算机和人类的交流的问题 , 出现了汇编语言 。 但是汇编语言晦涩难懂 , 所以又出现了像是C、C++、Java的这种高级语言 , 因此计算机语言一般分为低级语言和高级语言 。 使用高级语言编写的程序 , 经过编译转换成机器语言后才能运行 , 而汇编语言经过汇编器才能转换为机器语言 。
06汇编语言
我们先来看一段采用汇编语言表示的代码清单:

这是采用汇编语言编写程序的一部分 , 汇编语言采用助记符来编写程序 , 每个原本是电信号的机器语言指令会有一个与其对应的助记符 。 比如 , movadd分别是数据的存储(move)和相加(addition)的简写 。
汇编语言和机器语言一一对应 , 这点和高级语言不同 , 我们通常把汇编语言编写的程序转换为机器语言的这个过程 , 称之为汇编 。 与之相反 , 将机器语言转化为汇编语言的过程称之为反汇编 。
汇编语言可以帮助你理解计算机做了什么工作 , 机器语言级别的程序通过寄存器来处理 , 上面代码中的eaxebp都是表示的寄存器 , 它们是CPU内部寄存器的名称 。 因此可以说 , CPU是一系列寄存器的集合体 。
一般在内存中的存储通过地址编号来表示 , 寄存器的种类是通过名字来区分 。 那些不同类型的CPU , 其内部寄存器的种类、数量以及寄存器存储的数值范围也都是不同的 。 不过 , 根据功能的不同 , 我们可以将寄存器划分为下面几类:

其中 , 程序计数器、标志寄存器、累加寄存器、指令寄存器和栈寄存器只有一个 , 其他寄存器一般有好几个 。
07程序计数器
程序计数器是用来存储下一条指令所在单元的地址 。 程序在执行时 , PC的初值作为程序第一条指令的地址 , 在顺序执行程序时 , 控制器先按照程序计数器所指出的指令地址 , 从内存中取出一条指令 , 随后分析和执行该指令 , 并同时将PC的值加1指向下一条要执行的指令 。
我们可以通过一个事例来仔细看一下程序计数器的执行过程:
【iqoo neo5|关于CPU的12个硬核干货!】
这是一段进行相加的操作 , 程序启动 , 在经过编译解析后 , 会经由操作系统把硬盘中的程序复制到内存中 。
以上示例程序 , 就是将123和456执行相加的操作 , 随后将结果输出到显示器上 , 因为使用机器语言很难描述 , 所以这些都是经过翻译后的结果 。
事实上 , 每个指令和数据都有可能分布在不同的地址上 , 但是为了更好的说明 , 就把组成一条指令的内存和数据放在了一个内存地址上 。
地址0100是程序运行的起始位置 , Windows等操作系统把程序从硬盘复制到内存以后 , 就会将程序计数器作为设定为起始位置0100 , 然后再执行程序 , 每次执行一条指令后 , 程序计数器的数值就会增加1 , 或者是直接指向下一条指令的地址 。
随后 , CPU会根据程序计数器的数值 , 从内存中读取命令并且执行 , 换言之 , 程序计数器控制着程序的流程 。
08条件分支和循环机制
小伙伴们都学过高级语言 , 高级语言汇总的条件控制流程主要分为顺序执行、条件分支、循环判断三种 。
●顺序执行是按照地址的内容顺序的执行命令 。
●条件分支是根据条件执行任意地址的指令 。
●循环是重复执行同一地址的指令 。
一般情况下 , 顺序执行的情况较简单 , 每次执行一条指令程序计数器的值就是+1 。 条件和循环分支会使得程序计数器的值指向任意的地址 , 这样一来 , 程序就可以返回到上一个地址来重复执行同一个指令 , 或者跳转到其它任意指令 。