指令格式及寻址方式指令格式指令格式是指令字用二进制代码表示的结构形式。通常由操作码字段和地址码字段组成。一条指令的结构形式参考书上105页4.2操作码字段OP地址码字段A地址码是产品出厂时已经设定的号码,区别不同的设备,就如同机器的身份号。用以存储器中有许多存放指令或数据的存储单元。每一个存储单元都有一个地址的编号,即地址码。地址编号由小到大顺序增加,对该存储单元取用或存入的二进制信息称为该地址的内容,可以按地址去寻找访问存储单元里的内容。地址码(书106页)地址码通常指定参与操作的操作数的地址。根据一条指令中有操作数地址数X,可将该指令称为X操作数指令或X地址指令。目前二地址和一地址指令格式用的得最多。零地址指令的指令字中只有操作码,而没有地址码。一地址指令常称单操作数指令。(AC)OP(A)→AC(书4.2.2(2)中)OP码OP码A二地址指令常称双操作数指令,它有两个地址码字段A1和A2,分别指明参与操作的两个数在内存中或运算器通用寄存器的地址,其中地址A1兼做存放操作结果的地址。(A1)OP(A2)→A1三地址指令字中有三个操作数地址A1,A2和A3。(A1)OP(A2)→A3OP码A1A2OP码A1A2A3从操作数的物理位置来说,可把二地址指令可归结为三种类型:第一种:访问内存的指令格式存储器-存储器(SS)型指令:参与操作的数都放在内存里,从内存某单元中取操作数,操作结果存放至内存另一单元中。机器执行这种指令需要多次访问内存。第二种:访问寄存器的指令格式寄存器-寄存器(RR)型指令:需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作结果放到另一寄存器中。机器执行这种指令的速度很快,不需要访问内存。第三种:寄存器-存储器(RS)型指令:执行此类指令,既要访问内存单元,又要访问寄存器指令的寻址方式书112页4.4.1指令的寻址方式有两种:顺序寻址方式、跳跃寻址方式顺序寻址方式(放演示动画)由于指令地址在内存中按顺序安排,当执行一段程序时,通常是一条指令接一条指令地顺序进行。也就是说,从存储器取出第1条指令,然后执行这条指令;接着从存储器取出第2条指令,再执行第二条指令;接着再取出第3条指令。必须使用程序计数器(又称指令指针寄存器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。跳跃寻址方式当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。注意,程序跳跃后,按新的指令地址开始顺序执行。因此,指令计数据的内容也必须相应改变,以便及时跟踪新的指令地址。采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。操作数寻址形成操作数的有效地址的方法称为操作数的寻址方式。由于大型机、小型机、微型机和单片机结构不同,从而形成了各种不同的操作数寻址方式。下面介绍一些比较典型又常用的操作数寻址方式。隐含寻址这种类型的指令,不是明显地给出操作数的地址。而是在指令中隐含着操作数的地址。例如,单地址的指令格式,就不明显地在地址字段中指出第2操作数的地址,而是规定累加寄存器AC作为第2操作数地址。指令格式明显指出的仅是第1操作数的地址D。因此,累加寄存器AC对单地址指令格式来说是隐含地址。立即寻址指令的地址字段指出的不是操作数的地址,而是操作数本身,这种寻址方式称为立即寻址。立即寻址方式的H特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。[1]如:MOVAX,5678H注意:立即数只能作为源操作数,不能作为目的操作数。直接寻址直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址的字段中直接指出操作数在内存的地址。由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为直接寻址方式。在指令中直接给出参与运算的操作数及运算结果所存放的主存地址,即在指令中直接给出有效地址间接寻址间接寻址是相对直接寻址而言的,在间接寻址的情况下,指令地址字段中的形式地址不是操作数的真正地址,而是操作数地址的指示器,或者说此形式地址单元的内容才是操作数的有效地址。寄存器寻址方式和寄存器间接寻址方式当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。显然,此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号(可以是8位也可以是16位(AX,BX,CX,DX))。指令结构中的RR型指令,就是采用寄存器寻址方式的例子。如:MOVDS,AX寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。偏移寻址相对寻址方式相对寻址是把程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言。采用相对寻址方式的好处是程序员无须用指令的绝对地址编程,因而所编程序可以放在内存的任何地方。[1]指令格式:MOVAX,[BX+1200H]操作数物理地址PA=(DS/SS)*10H+EAEA=(BX/BP/SI/DI)+(6/8)位偏移量Disp对于BX,SI,DI寄存器来说段寄存器默认为DS,对于SP来说,段寄存器默认为SS基址寻址方式在基址寻址方式中将CPU中的基址寄存器的内容,加上指令格式中的形式地址而形成操作数的有效地址。基址寻址的优点是可以扩大寻址能力,因为与形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。变址寻址方式变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个变址寄存器的内容与偏移量D相加来形成操作数有效地址。但使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律变化。为此,必须使变址寄存器的内容实现有规律的变化(如自增1、自减1、乘比例系数)而不改变指令本身,从而使有效地址按变址寄存器的内容实现有规律的变化。段寻址方式微型机中采用了段寻址方式,例如它们可以给定一个20位的地址,从而有220=1M存储空间的直接寻址能力。为此将整个1M空间存储器以64K为单位划分成若干段。堆栈寻址堆栈有寄存器堆栈和存储器堆栈两种形式,它们都以先进后出的原理存储数据。数据进栈时使用PUSH指令,将数据压入栈顶地址,堆栈指示器减1;数据退栈时,使用POP指令,数据从栈顶地址弹出,堆栈指示器加1。这保证了堆栈中数据先进后出的存取顺序。