登录/注册
唐某
11055
占位
7
占位
31
浏览量
占位
粉丝
占位
关注
程序的机器级表示
唐某
2021-02-20 09:26:12 2021-02-20
365
0

汇编代码是计算机的一种低级表示,它是一种低级语言,可以从字面角度去理解它,包括处理数据、管理内存、读写存储设备上的数据,以及利用网络通信等。编译器生成机器码经过了一系列的转换,这些转换遵循编程语言、目标机器的指令集操作系统

指令集

指令集就是指挥计算机工作的指令,因为程序就是按照一定执行顺序排列的指令。因为计算机的执行控制权由 CPU 操作,所以指令集就是 CPU 中用来计算和控制计算机的一系列指令的集合。每个 CPU 在产出时都规定了与硬件电路相互配合工作的指令集。

指令集有不少分类,但是一般分为两种,一种是精简指令集,一种是复杂指令集。具体描述如下

精简指令集

精简指令的英文是 reduced instruction set computer, RISC,原意是精简指令集计算,简称为精简指令集,是 CPU 的一种 设计模式,可以把 CPU 想象成一家流水线工厂,对指令数目寻址方式都做了精简,使其实现更容易,指令并行执行程度更好,编译器的效率更高。

常见的精简指令集处理器包括 ARM、AVR、MIPS、PARISC、RISC-V 和 SPARC

所以你就能理解

assembly001

这本书是讲啥的了。

它主要是基于 MIPS 体系结构把冯诺依曼体系的五大组件进行了逐一的硬件实现 + 软件设计介绍,更为重要的是引入了诸多并行计算的内容,这是大部分教材中忽略或者内容较少的,会根据这个思路把并行相关的内容,结合 OpenMP, CUDA 和 Hadoop/Spark 整体融入到新书中,毕竟这是未来发展的趋势

还有这本书

assembly002

这本书又是讲啥的。

这本书是讲 RISC-V 指令集的,因为指令集的不同也区分了三个版本,三个版本???嗯,还有下面这个

assembly003

这本书是讲 ARM 指令集的。

所以一般在看 CASPP 的时候并发的看看这本书是非常不错的选择。

精简指令集一般具有如下特征

  • 统一的指令编码
  • 通用的寄存器,一般会区分整数和浮点数
  • 简单的寻址模式,复杂寻址模式被简单指令序列来取代
  • 支持很少偏门的类型,例如 RISC 支持字节字符串类型。

复杂指令集

复杂指令集的英文是 Complex Instruction Set Computing, CISC,是一种微处理器指令集架构,也被译为复杂指令集。

复杂指令集包括 System/360、VAX、x86 等

复杂指令集可以说是在精简指令集之上作出的改变。

复杂指令集的特点是指令数目多而复杂,每条指令字长并不相等,计算机必须加以判读,并为此付出了性能的代价。

一般来说,提升 CPU 性能的方法有如下这几种

  • 增加寄存器的大小
  • 增进内部的并行性
  • 增加高速缓存的大小
  • 增加核心时脉的速度
  • 加入其他功能,例如 IO 和计时器
  • 加入向量处理器
  • 硬件多线程技术

比较抽象,我们后面会组织成文章具体介绍一下。

C 编译器会接收其他操作并把其转换为汇编语言输出,汇编语言是机器级别的代码表示。我们之前介绍过,C 语言程序的执行过程分为下面这几步

assembly004

下面我们更多的讨论都是基于汇编代码来讨论。

我们日常所接触的高级语言,都是经过了层层封装的结果,所以我们平常是接触不到汇编语言的,更不会用汇编语言来进行编程,这就和你不知道操作系统的存在一样,但其实你每个操作,甚至你双击一个图标都和操作系统有关系。

高级语言的抽象级别很高,但是经过了层层抽象之后,高级语言的执行效率肯定没有汇编语言高,也没有汇编语言可靠。

但是高级语言有更大的优点是其编译后能够在不同的机器上运行,汇编语言针对不同的指令集有不同的表示。并且高级语言学习来更加通俗易懂,降低计算机门槛,让内卷更加严重(当然这是开个玩笑,冒犯到请别当真)。

话不多说,了解底层必须了解汇编语言。否则一个 synchronized 底层实现就能够让你头疼不已。而且,天天飘着也不好,迟早要落地。

了解汇编代码也有助于我们优化程序代码,分析代码中隐含的低效率,并且这种优化方法一旦优化成功,将是量级的提高,而不是改改 if...else ,使用一个新特性所能比的。

机器级代码

计算机系统使用了多种不同形式的抽象,可以通过一个简单的抽象模型来隐藏实现细节。对于机器级别的程序来说,有两点非常重要。

首先第一点,定义机器级别程序的格式和行为被称为 指令集体系结构或指令集架构(instruction set architecture), ISA。ISA 定义了进程状态、指令的格式和每一个指令对状态的影响。大部分的指令集架构包括 ISA 用来描述进程的行为就好像是顺序执行的,一条指令执行结束后,另外一条指令再开始。处理器硬件的描述要更复杂,它可以同时并行执行许多指令,但是它采用了安全措施来确保整体行为与 ISA 规定的顺序一致。

第二点,机器级别对内存地址的描述就是 虚拟地址(virtual address),它提供了一个内存模型来表示一个巨大的字节数组。

编译器在整个编译的过程中起到了至关重要的作用,把 C 语言转换为处理器执行的基本指令。汇编代码非常接近于机器代码,只不过与二进制机器代码相比,汇编代码的可读性更强,所以理解汇编是理解机器工作的第一步。

一些进程状态对机器可见,但是 C 语言程序员却看不到这些,包括

  • 程序计数器(Program counter),它存储下一条指令的地址,在 x86-64 架构中用 %rip 来表示。

程序执行时,PC 的初始值为程序第一条指令的地址,在顺序执行程序时, CPU 首先按程序计数器所指出的指令地址从内存中取出一条指令,然后分析和执行该指令,同时将 PC 的值加 1 并指向下一条要执行的指令。

比如下面一个例子。

assembly005

这是一段数值进行相加的操作,程序启动,在经过编译解析后会由操作系统把硬盘中的程序复制到内存中,示例中的程序是将 123 和 456 执行相加操作,并

暂无评论