一个指令系统具有哪几种寻址方式,即地址以什么方式给出,如何为编程提供方便与灵活性,这不仅是设计指令的关键,也是初学者理解一个指令系统的难点所在。
指令所需要的操作数可以存放在以下几种地方:
①操作数就包含在指令之中。
②操作数就存放在CPU的某个寄存器中。
③操作数存放在主存单元中。这里又可以分为几种情况:只需对某个操作数进行处理,或需要对一个连续的数组或表进行处理。
④操作数存放在堆栈区中。
⑤操作数存放在某个I/O接口的寄存器中。
一、立即寻址
在读取指令时也立即读出操作数。
通常用于为程序提供常数或某种初始值。虽然立即寻址方式能快速获得操作数,但在多数场合下,程序所处的数据是变化的,因此立即寻址方式的适用范围有限。
二、直接寻址
直接给出主存的有效地址或寄存器号,以读取操作数。
直接寻址的优点是简单、直观,便于硬件实现,适用于寻找固定地址的操作数。但有两点不足:①有效地址是指令的一部分,不能随程序需要动态改变,因而该指令只能访问某个固定的主存单元。②若指令要给出长的地址码,则需要地址码在指令中所占位数较多,导致指令字很长。
三、寄存器寻址
寄存器寻址也是一种“直接”寻址。
按寄存器号访问寄存器(按地址码直接访问主存单元),有两个重要的优点:
①从CPU的寄存器中读取操作数要比访问主存快得多,因而在CPU中设置足够的寄存器,以尽可能多地在寄存器之间进行操作,已成为提高工作速度的重要措施之一。
②由于寄存器数远小于主存单元数,所以指令中寄存器号字段所占位数也就大大少于主存地址码所需位数。采用寄存器寻址方式或其他以寄存器为基础的寻址方式(如寄存器间址),可以减少指令中一个操作数地址的位数。
四、间接寻址
先从某寄存器或主存单元中读取有效地址,再按这一地址访问主存以读取操作数。
间接寻址简称间址,在这种寻址方式中,存放操作数地址的主存单元叫做间址单元,间址单元的地址码为操作数地址的地址。
采用间接寻址方式可将间址单元当成一个读取操作数的地址指针,只要修改指针(即间址单元的内容),则同一条指令就可以用来在不同时间访问不同的存储单元。这种间接一次产生地址的方法提供了编程的灵活性。但间址方式增加了访存次数,因而减慢了工作速度。
五、寄存器间址及其变型
操作数在主存中,由指令给出寄存器号,被指定的寄存器中存放着操作数的有效地址。
寄存器间址方式有两个显著的优点:
①由寄存器提供地址和修改寄存器内容,要比从主存读出和修改快得多。因此在编程中,使用寄存器作为地址指针是一种基本方法。
②寄存器号所需位数比主存地址码位数少得多,因此采用寄存器间址方式也能减少指令中一个地址码的位数。
如果需要对主存中一个连续区间(如数组)进行操作,则每读出一个数据就需修改一次指针,即加1或减1.因此可从寄存器间址方式推出变型的寻址方式,使地址指针自动修改。
六、变址寻址
变址方式是通过地址计算使地址灵活可变。这是为了增加编程的灵活性。
指令的地址部分给出一个形式地址(位移量),并指定一个寄存器作为变址寄存器;变址寄存器内容(变址量)与形式地址相加,得到导致数有效地址;按照有效地址访问某主存单元,该单元内容为操作数。
变址寻址的典型用法是:将形式地址作为基准地址,将变址寄存器内容作为修改量(变址量)。
七、相对寻址
以当前指令位置为基准,相对它进行位移(往前或往后)定位,所以称为相对寻址。
用程序计数器PC作为基准地址,指令中给出的形式地址作为位移量(可正可负),二者相加后形成操作数的有效地址。这种寻址方式的主要特点是:
①PC指示的是当前指令地址,而指令中的位移量指出的操作数有效地址与PC内容之间的相对距离。当指令地址变化时,由于其位移量不变,使得操作数与指令在可用的存储区内一起移动,所以仍能保持程序的正确执行。这样,整个程序模块就可以安排在主存中的任意区间执行。这是很有实用价值的,尤其是在程序转移时,常用PC内容为基准,因此转移类指令常采用相对寻址方式。
②对于指令地址而言,操作数地址可能在指令地址之前或之后。因此,指令中给出的位移量可正、可负,通常用补码表示。
相对寻址是以当前指令地址为基准,还是以下一条指令地址为基准。目前的多数机器采用后者,这是由于机器在执行当前指令时,PC指向的是下一条指令地址。但是采用这种方法计算位移量较麻烦,特别对于变字长指令,需要计算当前指令占用几个单元,相应的位移量计算也就不同。为了弥补这个缺陷,在用汇编语言编程时,常用符号来表示操作地址,而位移量的计算由汇编器完成。
八、堆栈寻址
堆栈是一种按“后进先出”(“先进后出”)存取顺序进行存取的存储结构。
通常在主存中划出一段区域作为堆栈区,其起点可通过程序设定,其范围可根据需要变化。
堆栈有两端,作为起点的一段固定,称为栈底,在开辟堆栈区时由程序设定其地址。另一端称为栈顶,随着将信息压入堆栈,栈顶位置自底(地址码值较大)向上(地址码值减小)浮动。对堆栈的读出(弹出)或写入(压栈)都是对栈顶单元进行的。为了指示栈顶的位置,CPU中设置一个具有加、减计数功能的寄存器作为堆栈指针,命名为SP,SP中的内容就是堆栈单元地址。