处理器负责从内存读取数据,并利用数据执行加法等处理。指示执行这些处理的就是“指令”。指令有以下几种:进行加法的ADD指令,进行乘法的MULT(multiply)指令,以及读写内存的LOAD指令、STORE指令等。让我们看看这些指令是怎样规定的。
前面说过,指令架构详细地规定了处理器应当支持哪些指令、各个指令应执行什么操作等。
“架构”这个词源于建筑术语,意思是建筑的基本设计,现在被挪用到计算机的基本设计中,表示指令的设计、结构等。
拿汽车打比方,可以把指令架构想象成这样:发出向右打方向盘的指令,汽车就向右转;发出踩油门的指令就加速;发出踩刹车的指令就减速。对于汽车来说,这些基本指令是通用的,而汽车大灯、转向灯(转向提示器)的操作,以及空调、导航的操作指令,则由各家公司自行设计。
至于处理器的情况,Intel和AMD的x86处理器、PowerPC、SPARC、ARM、MIPS等各处理器的指令系统的应用领域和各指令的位排列顺序都不一样,互相并不兼容,因此一个指令架构上的机器语言程序(后面详细介绍)无法在其他指令架构的处理器上运行。
架构的指令格式
图1.15描述了Intel x86的指令格式。原来Intel/AMD的x86处理器只能处理8位和16位数据,架构扩展后才支持32位、64位数据。但是,指令中只有1比特用于区分8位指令还是16位指令,所以该比特被扩展为表示8位/32位切换或8位/64位切换。※ ModR/M为指定寄存器和内存的修饰符(ModR/M还有其他功能),SIB可能是Scale、Index、Base的缩写,不过Intel没有给出这些词汇的定义。
图1.15“Prefix”部分指定了是否要进行这种扩展。
图1.15的“指令”部分为ADD(加法)、MOV(内存与寄存器之间数据复制)等(后面会介绍其他指令)1~3字节长的指令种类。
如果进行运算的两个操作数(运算的输入数据)都是寄存器,那么可以用图1.15的“指令”栏表示这种情况;如果操作数位于内存中,就要用到下一个“ModR/M”栏(1字节)(图1.15)。
操作数位于内存中时,图1.15的“SIB”栏(1字节)可以用来指定地址计算的修饰方法,还可以利用图1.15的“偏移”栏指定1~4字节长的地址偏移。
如果不使用寄存器或内存,而是将常量作为操作数,就把它的值写到1~4字节的“立即数”栏(图1.15)。
并不是所有指令都有这些栏,不必要的栏位可以省略,所以叫做“可变长指令格式”。指令格式的长度将在第2章介绍。
的称呼
Intel处理器的指令架构始于1978年发售的8086处理器。后来,Intel还发行了80186、80286、80386、80486等性能更高的处理器,因此连同后来的Pentium、Core处理器在内,这些处理器统称为x86。x86处理器的指令架构称为“x86架构”。
但是Intel对它正式称为IA-32(Intel Architecture-32),AMD的正式名称为AMD86架构。
计算机使用二进制,处理器的指令也由0和1组成。处理器依次读取内存中保存的指令,理解指令内容,然后执行指令的处理。这种处理器能够理解的指令格式称为“机器指令(Machine Instruction)”。
机器指令有以下几种:
—进行数据加减乘除的算术运算指令
—进行数据位运算的AND、OR、NOT等逻辑运算指令
—从内存读取数据的加载指令(Load Instruction)等
—向内存写入数据的存储指令(Store Instruction)等
此外,执行完一条指令后,处理器会读取下一个地址的指令并执行,但分支指令(Branch Instruction)可以更改下一个要执行的指令。而条件分支指令(Conditional Branch Instruction)可以判断前面的运算结果是0还是负数,只有在满足指定条件时才进行跳转,不满足条件时继续执行下一个地址的指令。
加载、存储指令等访问的内存都是有地址的。带有地址的内存排列成区间,就像现实世界中的开阔场地一样,因此把带有地址的区间整体称为地址空间。图1.16为16/32/64位地址空间的示意图。
图1.16 16/32/64位地址空间示意图
20世纪70年代的8位微处理器,访问内存时只能指定16位(0~65535)地址。因此能访问的最大内存容量也被限制在64KB之内。也就是说,这些处理器的地址空间是64KB。
可见,内存地址的位数与运算器、寄存器的位数大多数情况下是一致的,但这并不是必需的。例如,第一代x86处理器8086的内存地址只有16位,但加上偏移量(程序的起始地址)后变成20位,就可以访问1MB的地址空间。但是,8086上一个程序能使用的内存空间只有16位,运算器与寄存器也是16位,因此被称做16位架构。
另外,现在的处理器大都拥有64位运算器和寄存器,但还没有安装264字节内存的计算机,因此内存地址总线的实际宽度为40~48位左右。不过,这些处理器依然叫做64位架构。所以说,XX位架构并不是太严格的定义,根据常理判断就行了。
位地址空间
随着计算机安装的内存容量增加,8086的地址指定方式已不能访问所有内存。因此,Intel的Pentium处理器和各种RISC处理器都准备了32位运算指令,用32位指定内存地址。这些处理器的地址空间是4GB,不过4GB并不是指内存空间的大小,而是指这些处理器拥有32位地址空间。
32位地址可以访问4GB的内存,但说到底只是“可以指定4GB地址空间”,并不意味着计算机一定有4GB内存空间。事实上,第一个支持32位地址空间的处理器问世当初,计算机的实际内存容量不过几MB而已。而且,当时认为32位地址空间应该很宽裕了,哪知现在的服务器会安装16GB以上的内存,就连个人计算机也动不动就安装4GB以上的内存,因此32位地址空间明显不够用了。
位地址空间——AMD86-64、Intel 64
20世纪90年代,RISC处理器(后述)增加了64位运算指令,开始支持64位地址空间。而x86系列中,AMD在2000年先行发表了名为AMD86-64的64位扩展架构,之后Intel也开始支持同一种架构。为了将64位扩展架构与原来的x86架构区别,通常称它为“x64架构”。
现在的计算机安装的内存达到几GB甚至数十GB,预计今后还会继续按照每三年增长四倍的速度发展,那么64位地址空间也将在40~45年后开始捉襟见肘。在那之前的10年内必须扩展地址空间,所以可以预见,从现在开始30~35年后,即2040—2045年间,就要采用支持128位地址空间的指令架构了。