计算机的工作过程是执行程序的过程,程序是一系列按一定顺序执行的指令。
指令是指挥机器执行某种操作的命令,是计算机运行的最小功能单元(一组二进制代码)。
指令系统:计算机中所有指令的集合,也称指令集。
一个指令系统中,若所有指令长度相同,称为定长指令字结构;若指令长度不同,称为变长指令字结构。
指令的执行过程:取指令,分析指令,执行指令。
取指令:按照程序设定的顺序,从内存取出当前执行的指令,并送到控制器的指令寄存器(IR)中。
分析指令:控制单元(CU)对指令的操作码进行分析,确定计算机应执行什么操作。
执行指令:由控制器发出完成操作所需的一系列控制电位,以便指挥计算机有关部件完成这一操作,同时,程序计数器加“1”或根据转移指令得到下一条指令的地址。
程序执行之前,会将程序的起始地址(即第一条指令的地址)送入程序计数器(PC)中。
每取出一个指令,程序计数器就会得到下一个指令的地址,指令的寻址方式有两种:顺序寻址、跳跃寻址。
顺序寻址:按照顺序依次执行的指令。PC自动加“1”。“1”可以理解为指令字长,实际加的值会因指令长度、编址方式不同而不同。
跳跃寻址:由转移指令指出下一条指令的地址。即转移指令改变了PC的值。
指令的组成:操作码,地址码。
操作码:指明执行什么操作。
一个指令系统中,若所有指令操作码的长度相同,称为定长操作码(n位操作码对应条指令);若指令操作码的长度不同,称为可变长操作码。
按操作类型,操作码可分为:数据传送类、运算类、程序控制类、输入输出类。
数据传送类:CPU与主存之间数据传送。
运算类:算术运算(加减乘除等)、逻辑运算(与或非异或等)、移位等。
程序控制类:改变程序执行顺序。例如:转移(条件转移、无条件转移)、调用和返回、Trap指令等。
输入输出类:主机与I/O设备之间数据传送。
地址码:指出被操作的数据(简称操作数)存放在哪里,即指明操作数地址,有的指令格式允许地址码就是操作数本身。
地址码可以有若干个,因此,指令又分为四地址指令、三地址指令、二地址指令、一地址指令、零地址指令。
地址码可以是操作数、也可以是地址;跳跃寻址时的地址码也可以有不同解读。因此,为便于数据寻址,地址码的前几位用来指明是什么寻址方式(即寻址特征、或称寻址方式位)。
数据寻址方式:隐含寻址、立即寻址、直接寻址、间接寻址、寄存器(直接)寻址、寄存器间接寻址、基址寻址、变址寻址、相对寻址、堆栈寻址。
不会明确给出操作数的地址,而是在指令中隐含操作数地址。
例如:两个操作数,地址码中只给出1个,另一个隐含在ACC(累加寄存器)中。
完成一条指令(不考虑存结果)访问主存1次(取指令1次+执行指令0次)。
可以缩短指令字长,但需专门硬件存储操作数或操作数地址。
地址码就是操作数也称为立即数。操作数一般以补码形式表示。无需访问主存。
完成一条指令(不考虑存结果)访问主存1次(取指令1次+执行指令0次)。
地址码直接是主存的实际地址。直接访问主存读取数据。
完成一条指令(不考虑存结果)访问主存2次(取指令1次+执行指令1次)。
一次间接寻址:地址码是主存的形式地址(该地址存储了实际地址)。
访问主存的形式地址获取实际地址,再访问主存的实际地址读取所需的数据。
完成一条指令(不考虑存结果)访问主存3次(取指令1次+执行指令2次)。
两次间接寻址:地址码是主存的形式地址1(该地址存储的仍是形式地址2,形式地址2才存储了实际地址)。
访问主存的形式地址1获取形式地址2,再访问主存的形式地址2获取实际地址,再访问主存的实际地址读取所需的数据。
完成一条指令(不考虑存结果)访问主存4次(取指令1次+执行指令3次)。
地址码是寄存器的编号,且寄存器存储的是所需的数据。
数据在寄存器中,访问寄存器即可,不需要访问主存,因此速度快,但价格贵且寄存器数量有限。
完成一条指令(不考虑存结果)访问主存1次(取指令1次+执行指令0次)。
地址码是寄存器的编号,但寄存器存储的是所需数据的主存的实际地址。
寄存器间接一次寻址:访问寄存器获取主存的实际地址,再访问主存的实际地址读取所需的数据。
完成一条指令(不考虑存结果)访问主存2次(取指令1次+执行指令1次)。
程序可以在主存的任意位置,可通过程序的起始位置加上数据相对于程序起始位置的偏移量(即数据在程序中的位置)找到数据。即程序的起始地址+偏移量。基址寻址属于偏移寻址。
地址码是“偏移量”。基址寄存器(BR)存储当前程序的起始地址。也可以使用通用寄存器,若使用通用寄存器,需在指令上指明是哪个寄存器。
基址寄存器中的基地址加上偏移量得到主存的地址,再访问主存读取所需的数据。
多用于多道程序,适合程序在主存中浮动。
基址寄存器面向操作系统,基址寄存器的内容只能操作系统修改。若使用通用寄存器,可由用户指定用哪个通用寄存器,但内容仍只能操作系统修改。
处理数组时,数组中的数据可通过数组的起始地址加上数据相对于数组起始地址的偏移量来找到。即数组的起始地址+偏移量。而数组的起始地址可用户设定。即变址寻址。变址寻址属于偏移寻址。
地址码是“基地址”。变址寄存器(IX)中的值为“偏移量”。也可以使用通用寄存器。
“基地址”加上变址寄存器中的“偏移量”得到主存地址,再访问主存读取所需的数据。
多用于循环程序以及处理数组(设定地址码为数组的起始地址)。
变址寄存器面向用户,变址寄存器的内容可由用户修改。
程序内部的某些代码改动位置,因此该段代码相对于程序内部的位置在改变,使用相对寻址。相对寻址属于偏移寻址。
地址码是相对于程序计数器的“偏移量”,可正可负,一般用补码表示。
程序计数器(PC)中的值加上“偏移量”得到主存地址,再访问主存读取所需的数据。
相对寻址用于程序浮动(程序内部的浮动)。广泛应用于转移指令。
隐含的地址码是堆栈指针(SP)。操作数存放在堆栈中。
堆栈可以由一组寄存器组成,称为硬堆栈。也可以在主存中划分一块区域作为堆栈使用,称为软堆栈。寄存器价格贵,一般使用软堆栈。堆栈指针(SP)实际是一个特定的寄存器。
扩展操作码指令格式:指令长度相同(定长指令字结构)的情况下,操作码长度不同(可变长操作码)。
n位操作码对应条指令,留出1条或多条(即m条)作为更长操作码的前缀(扩展操作码,假设扩展n位);更长操作码共有条指令。
操作码不能重复;操作码不能是更长操作码的前缀,否则分析指令时会发生错误。
指令字长:一条指令的总长度。(指令长度可能会变)
机器字长:CPU进行一个整数运算所能处理的二进制数据的位数。(通常和ALU直接相关)
存储字长:一个存储单元中的二进制代码的位数。(通常和MDR位数相同。)