概述
指令和指令系统是计算机中最基本的概念。指令是指示计算机执行某些操作的命令。指令系统是一台计算机中的机器指令的集合,也称为指令集。
指令系统是硬件和软件之间的界面,直接影响计算机系统的性能。它既是机器硬件设计的依据,也是软件设计的基础。对硬件设计者而言,指令系统提出了对中央处理器的功能性需求,实现CPU的任务大部分都涉及指令系统的实现。对软件设计者而言,指令系统就是他们看到的计算机的主要属性。
设计指令系统就是要选择计算机系统中的一些基本操作应该由硬件实现还是由软件实现,选择复杂操作是由一条专门的指令实现,还是由一串基本指令实现,然后具体确定指令系统的格式、类型、操作以及对操作数的访问方式。
指令的表示
在计算机内部,用一个二进制位串来表示的机器指令,这个位串会划分成几个字段,分别对应于指令的各个要素。例如:二进制位串10010110就是一条指令,它表示将寄存器R1和R2中的数据相加,并将结果放入R1中。
由于机器指令的二进制位串表示法不易记忆和阅读,因此,普遍使用的是机器指令的符号表示法。操作码被缩写成助记符(Memonic)来表示。例如,ADD代表加; SUB代表减;MUL代表乘;操作数也可用符号表示。例如,上述指令(10010110)就可以表示为:ADD R1,R2
指令类型
一台计算机的指令系统中包含很多指令,这些指令按其功能可以分成以下几种类型:
1)数据处理指令:包括算术运算指令、逻辑运算指令、移位指令和比较指令等。
2)数据传送指令:包括寄存器之间、寄存器与主存储器之间的传送指令等。
3)程序控制指令:包括条件转移指令、无条件转移指令、转子程序指令等。
4)输入输出指令:包括各种外围设备的读、写指令等,有的计算机将输入输出指令包含在数据传送类指令中。
指令集设计
计算机设计的一个最具影响的方面就是指令集的设计。指令集的设计是一件很复杂的事情,因为它影响计算机系统的诸多方面。
指令集设计需考虑的基本内容主要包括以下几个方面:
1)操作清单:应提供多少种操作和什么样的操作,以及操作的复杂程度。
2)数据类型:对哪几种数据类型完成操作。
3)指令格式:指令长度/地址数目/每个字段长度。
4)寄存器:能被指令访问的CPU寄存器数目以及它们的用途。
5)寻址方式:指定操作数地址的产生方式。
对指令系统的要求
1)完备性:完备性是指用汇编语言编写各种程序时,指令系统直接提供的指令足够使用,而不必用软件来实现。完备性要求指令系统丰富、功能齐全、使用方便。一台计算机中最基本、必不可少的指令是不多的。许多指令可用最基本的指令编程来实现。例如,乘除运算指令、浮点运算指令可直接用硬件来实现,也可用基本指令编写的程序来实现。采用硬件指令的目的是提高程序执行速度,便于用户编写程序。
2)有效性:有效性是指利用该指令系统所编写的程序能够高效率地运行。高效率主要表现在程序占据存储空间小、执行速度快。一般来说,一个功能更强、更完善的指令系统,必定有更好的有效性。
3)规整性:规整性包括指令系统的对称性、匀齐性、指令格式和数据格式的一致性。对称性是指:在指令系统中所有的寄存器和存储器单元都可同等对待,所有的指令都可使用各种寻址方式;匀齐性是指:一种操作性质的指令可以支持各种数据类型,如算术运算指令可支持字节、字、双字整数的运算,十进制数运算和单、双精度浮点数运算等;指令格式和数据格式的一致性是指:指令长度和数据长度有一定的关系,以方便处理和存取。例如指令长度和数据长度通常是字节长度的整数倍。
4)兼容性:系列机各机种之间具有相同的基本结构和共同的基本指令集,因而指令系统是兼容的,即各机种上基本软件可以通用。但由于不同机种推出的时间不同,在结构和性能上有差异,做到所有软件都完全兼容是不可能的,只能做到“向上兼容”,即低档机上运行的软件可以在高档机上运行。
复杂指令系统计算机CISC与精简指令系统计算机RISC
70年代末期—随着LSI和VLSI的出现,计算机结构愈加复杂,计算机指令系统多达几百条指令,称之为复杂指令集计算机complex instruction set computers,简称CISC.
(1)CISC特点:
(2) CISC的缺点:
庞大的指令系统必然增加硬件实现的复杂性,使计算机研制周期加长;
各种指令使用频率相差悬殊,仅占指令总数20%的比较简单的指令, 在程序中出现的频率高达80%.采用了大量使用频率很低的复杂指令而造成硬件资源浪费;
复杂的指令系统需要复杂的控制器,复杂的控制部件占据了相当的CPU芯片面积,使系统不能用更多芯片面积实现数据的运算操作部件;
由于指令操作复杂、控制部件庞大,使得指令的执行速度降低
增加了编译程序的负担。
为克服CISC的不足,提高指令执行速度,人们又提出了便于VLSI技术实现的精简指令集计算机reduced instruction setcomputers,简称RISC。
(1)RISC目的:
希望用20%左右的简单指令来组合实现不常用的80%指令的功能。不是简单地将指令系统简化,而是通过简化指令系统,使计算机的结构更加简单合理,从而提高处理速度。
(2) RISC特点:
选取使用频率最高的一些简单指令,指令条数少;
指令长度固定,指令格式种类少,寻址方式种类少;
多数指令的操作都在寄存器之间进行
IA32编程
IA32, x86-64的32位前身, 是Intel在1985年提出的, 几十年来一直是Intel的机器语言之选。 今天出售的大多数x86微处理器, 以及这些机器上按照的大多数操作系统, 都是为运行下6-64设计的。 不过,它们也可以向后兼容执行IA32程序。 所以,很多应用程序还是基于IA32的。 除此之外, 由于硬件或系统软件的限制, 许多已有的系统不能够执行x86-64. IA32仍然是一种重要的机器语言。 学习过x86-64会使你很容易地学会IA32机器语言。
Intel处理器系统有好几个名字, 包括IA32, 也就是“Intel 32位体系结构(Intel Architecture 32-bit)”, 以及最新的Intel64, 即IA32的64位扩展, 我们也称为x86-64. 最常用的名字是“x86“, 我们用它指代整个系列, 也反映了直到i486处理器命名的惯例。