4.1.2 指令集体系结构
一个完整的计算机系统是由硬件系统和软件系统构成的多个抽象层次结构系统,希望计算机完成或解决的任何一个应用问题最开始是用自然语言描述的,但是,计算机硬件只能理解机器语言,而要将一个自然语言描述的应用问题转换为机器语言程序,需要经过多个抽象层的转换。其实,计算机解决应用问题的过程就是不同抽象层进行转换的过程。图4.1是计算机系统抽象层次转换示意图,描述了从最终用户希望计算机完成的应用(问题)到电子工程师使用器件完成基本电路设计的整个转换过程。
图4.1 计算机系统抽象层及其转换
在计算机系统的抽象层中,每个抽象层的引入都是为了对它的上层屏蔽或隐藏其下层的实现细节,从而为其上层提供简单地使用接口,其中,最重要的抽象层就是指令集体系结构(Instruction Set Architecture,ISA),它是计算机硬件和软件之间的一个“桥梁”,作为计算机硬件之上的抽象层,对使用硬件的软件屏蔽了底层硬件的实现细节,将物理上的计算机硬件抽象成一个逻辑上的虚拟计算机,称为机器语言级虚拟机。
ISA 定义了一台计算机可以执行的所有指令的集合,每条指令规定了计算机执行什么操作,以及所处理的操作数存放的地址空间和操作数类型,主要包括如下信息:
(1)可执行的指令的集合,包括指令格式、操作种类以及每种操作对应的操作数的相应规定。
(2)指令可以接受的操作数的类型。
(3)操作数所能存放的寄存器组的结构,包括每个寄存器的名称、编号、长度和用途。
(4)操作数所能存放的存储空间的大小和编址方式。
(5)操作数在存储空间存放时按照大端还是小端方式存放。
(6)指令获取操作数的方式,即寻址方式。
(7)指令执行过程的控制方式,包括程序计数器、条件码定义等。
ISA 规定了机器级程序的格式和行为,用机器指令或汇编指令编写机器级程序的程序员必须对运行该程序机器的ISA 非常熟悉。不过在工作中大多数程序员用抽象层更高的高级语言(如C/C++、Java)编写程序,再由编译器将其转换为机器级程序,并在转换过程中进行语法检查、数据类型检查等工作,似乎程序员不再需要了解ISA 和底层硬件的执行机理。但是,由于高级语言抽象层太高,隐藏了许多机器级程序的行为细节,使得高级语言程序员不能很好地利用与机器结构相关的一些优化方法来提升程序的性能,也不能很好地预见和防止潜在的安全漏洞或发现他人程序中的安全漏洞。如果程序员对ISA 和底层硬件实现细节有充分的了解,则可以更好地编制高性能程序并避免程序的安全漏洞。