组成原理(四):指令系统之 寻址技术
寻址:寻找操作数的地址或下一条将要执行的指令地址。寻址技术包括 编址方式 和 寻址方式。
1、编址方式
编址方式是指对各种存储设备进行编码的方式。
1.1、编址
指令中的地址码字段将指出操作数的来源和去向,而操作数则存放在相应的存储设备中。在计算机中需要编址的设备主要有CPU中的通用寄存器、主存储器和输入输出设备三种。
对寄存器、主存储器和输入输出设备进行访问,需对它们进行编址。
编址设备
|
编址
|
CPU中的通用寄存器
|
指令字中给出寄存器编号
|
主存中的一个存储单元
|
指令字给出主存单元的地址
|
输入输出设备
|
指令字给出设备编号或设备端口地址
|
1.2、编址单位
常用的编址单位:字编址、字节编址和位编址。
字编址,每个编址单位包含的信息量(二进制数)与访问一次寄存器、主存所获得的信息量相同。采用字编址的机器中,每执行一条指令,程序计数器加1;每从主存中读出一个数据,地址计数器加1。
字节编址,为适应非数值应用的需要。字节编址方式使编址单位与信息的基本单位(一个字节)相一致。
位编址,该种编址方式的地址信息浪费较多。
1.3、指令中地址码的位数
指令格式中每个地址码的位数是与主存容量和最小寻址单位(编址单位)相关联。主存容量越大,所需的地址码位数就越长。
对相同容量来说,若以字节为最小寻址单位,那么地址码的位数需要长些,但可以对每一个字符进行处理;若以字为最小寻址单位,那么地址码的位数可以减少。
2、指令寻址和数据寻址
寻址可分为指令寻址和数据寻址。
指令寻址,寻找下一条将要执行的指令地址;数据寻址,寻找操作数的地址。
指令寻址可细分为 顺序寻址 和 跳跃寻址;数据寻址的最终目的是寻找所需要的操作数。
顺序寻址,通过程序技术器加1,自动形成下一条指令的地址;跳跃寻址,需要通过程序转移类指令实现。
跳跃寻址的转移地址形成当时有3种:直接(绝对)、相对和间接寻址,寻找转移的有效地址。
3、基本的数据寻址方式
数据寻址方式是根据指令中给出的地址码字段寻找真实操作数地址的方式。
指令中地址码字段给出的地址称为形式地址(字母A表示),该地址可能不能直接主存。形式地址经过某种运算而得到的能够直接访问主存的地址称为有效地址(用字母EA表示)。
从形式地址生成有效地址的各种方式称为寻址方式,即
指令中的形式地址 (寻址方式)→ 有效地址
3.1、立即寻址
立即寻址,特殊的寻址方式,指令中在操作码字段后面的部分是操作数本身。
数据包含在指令中,只要取出指令,也就取出了可以立即使用的操作数,这样的数称为立即数。指令格式为:
在取指令时,操作码和操作数被同时取出,不必再次访问主存,从而提高了指令的执行速度。
但因操作数是指令的一部分,不能被修改,而且立即数的大小受到指令长度的限制,这种寻址方式灵活性差。
3.2、寄存器寻址
寄存器寻址指令的地址码部分给出一个通用寄存器的编号Ri,这个指定的寄存器中存放着操作数。
寄存器寻址过程如下:
IR表示指令寄存器,是从主存中取出的指令。操作数与寄存器Ri的关系为:
S = (Ri)
这种寻址方式从寄存器中存取数据比从主从中存取快;因计算器数量较少,地址码字段比主存单元地址字段短的多。
3.3、直接寻址
指令中地址码字段给出地址A就是操作数的有效地址,即形式地址等于有效地址:EA = A。因操作数地址是不能修改,又被称为绝对寻址方式。
操作数与地址码A的关系为:S = (A)
直接寻址的过程如下:
地址空间受到指令中地址码字段位数的限制。
3.4、间接寻址
间接寻址,指令中给出的地址A不是操作数的地址,而是存放操作数地址的主存单元的地址,简称操作数地址的地址。
通常在指令格式中划出以为作为直接或间接寻址的标志位,间接寻址时标志位为@=1。
间接寻址有一级寻址和多级间接寻址之分。间接寻址过程如下:
一级间接寻址,操作数与地址码的关系为 S = ((A)):
多级间接寻址:
多级间接寻址为取得操作数需要多次访问主存,在找到操作数有效地址后,还需再访问一次主存才可得到真正的操作数。
多级间接寻址,寻址过程中访问到的每个主存单元的内容都应设有间址标志位。该标志位放在主存的最高位。该位为1时,表示这一主存单元中仍是间接地址,需要继续间接寻址;该位为0时,表示已经找到了有效地址,根据这个地址可读出真正的操作数。
间接寻址比直接寻址灵活,扩大了寻址范围,可用指令中的短地址访问大的主存空间;可将主存单元作为程序的地址指针,用以知识操作数在主存中的位置。修改操作数的地址,只需修改存放有效地址的那个主存单元的内容即可。
间接寻址降低了取操作数的速度,需要多次访问主存。
3.5、寄存器间接寻址
寄存器间接寻址,指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在主存单元中,寻址过程如下:
操作数S与寄存器号Ri的关系为:S = ((Ri))。
这种寻址方式指令较daunt,取指后只需一次访存便可得到操作数,比间接寻址快。
3.6、变址寻址
变址寻址就是把变址寄存器Rx的内容与指令中给出的形式地址A相加,形成操作数有效地址,即EA = (Rx) + A。
Rx的内容改称为变址值。操作数S与地址码和变址寄存器的关系为:S = ((Rx) + A)。
变址寻址,最典型的用法是将指令中的形式地址作为基准地址,而变址寄存器的内容作为修改量。
3.7、基址寻址
基址寻址是将基址寄存器Rb内容与指令中给出的位移量D相加,形成操作数有效地址,即EA=(Rb) + D。基址寄存器的内容称为基址值。
指令的地址码字段是一个位移量,位移量可正、可负。操作数S与机制寄存器和地址码的关系为:S = ((Rb) + D)。
基址寻址是将用户的逻辑地址(用户编程时使用的地址)转换为主存的物理地址(程序在主存中的实际地址)。
变址寻址中变址寄存器提供修改量(可变的),而指令中提供基准值(固定的);基址寻址中基址寄存器提供基准值(固定的),指令中提供位移量(可变的)。
变址寻址是面向用户的,用于访问字符串、向量和数组等成批数据;而基址寻址面向系统,主要用于逻辑地址和物理地址的变换,用来解决程序在主存中的在定位和扩大寻址空间问题。
3.8、相对寻址
相对寻址是基址寻址的拓展,有程序计数器(PC)提供基准地址,指令中的地址码字段作为位移量D,两者相加后得到操作数的有效地址,即 EA = (PC) + D。
位移量指出的是操作数和现行指令之间的相对位置,如下所示:
该种寻址方式特点如下:
操作数的地址不是固定的,随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值。当指令地址变换时,由于位移量不变,使操作数与指令在可用的存储区内一起移动,仍能保证程序的正确执行。
对于指令地址而言,操作数地址可在指令地址之前或之后,因此指令中给出的位移量可负、可正,常用补码表示。
3.9、页面寻址
页面寻址相当于将主存空间分成若干个大小相同的区,每个区称为一页,每页有若干个主存单元。
每页都有自己的编号,称为页面地址;页面内的每个主存单元的编号,称为页内地址。
存储器的地址分为页面地址和页内地址。页内地址由指令的地址码部分自动直接提供,与页面地址通过简单的拼接连接得到有效地址,无需进行计算。
页面寻址的分类
基页寻址
|
又称零页寻址,页面地址全等于0.有效地址 EA = 0。操作数在零页面之后
|
|
当前页寻址
|
页面地址等于程序计数器PC的高位部分内容,有效地址EA = (PC)H,操作数与指令处于同一个页面
|
|
页寄存器寻址
|
页面地址取自页寄存器
|
|
指令中设置表示,标识指令是 显示 还是 隐式。
显示的方式在指令中设置专门的寻址方式字段,用二进制编码表明寻址方式类型。
隐式的方式是由指令的操作码字段说明指令格式并隐含约定的寻址方式。