上篇文章我们讲到,指令的基本格式,一条指令通常包括操作码字段和地址码字段两部分:
操作码字段 | 地址码字段 |
并且我们还讲到根据操作数地址码的数目不同,可将指令分为零一二三四地址指令。感兴趣的小伙伴们可以看看小编的上一篇文章:
408考研计算机之计算机组成与设计——知识点及其做题经验篇目2:指令系统_计算机鬼才~的博客-CSDN博客
那么本期的博客小编将会探讨,计算机通过地址码字段,找到指令或者操作数有效地址的方式,跟随好小编的脚步,我们发车啦!
目录
一、指令寻址
1、顺序寻址
2、跳跃寻址
二、数据寻址具体方式
1、直接寻址与间接寻址
①直接寻址
②间接寻址
2、寄存器寻址与寄存器间接寻址
①寄存器寻址
②寄存器间接寻址
3、立即寻址
4、隐含寻址
5、偏移寻址
①相对寻址
②基址寻址
③变址寻址
6、堆栈寻址
三、几种寻址的比较
一、指令寻址
考点1:指令寻址
寻址方式分为指令寻址与数据寻址两大类,其中寻找下一条将要执行的指令地址称为指令地址;寻找本条指令的数据地址称为数据寻址。
其中较为简单的是指令寻址,看篇幅我们就知道,数据寻址有十种方法,基本上除了考点1里面讲到了指令寻址,其他的全是数据寻址。
指令寻址有有两种方式,一种是顺序寻址方式,另一种是跳跃寻址方式。
1、顺序寻址
《王道考研》书上边就一句话,叫“通过程序计数器PC加1(1个指令字长),自动形成下一条指令的地址”。
但其实,这个自动加一,大有文章可言,尤其是括号里的1个指令字长,妙不可言。这个1是泛指而不是特指,你可以把这个1理解为,下一条指令的地址是下一条地址,但是具体问题要具体分析。比如说当主存按字节编址,而指令字长有两个字节,如下图:
编号1:01101100 |
编号2:10100011 |
编号3:11001010 |
编号4:00110010 |
…… |
主存按字节变址,所以每8位构成主存的一个存储单元 ,此时的PC存放的内容为01101100的地址,我们暂时以编号1来称呼这个地址名。而由于指令字长有两个字节,即编号1(01101100)与编号2(10100011)共同构成了这一条指令。那么想要执行下一条指令,我们需要执行(PC)+2PC,即执行从编号3开始构成的这条指令。
这一问题不大容易直接考,但是融合到某个选择题或者大题里面,不注意就容易错!
2、跳跃寻址
通过转移类指令来实现,比如说无条件转移指令、有条件转移指令。所谓跳跃,是指下条指令的地址不由程序计数器PC自动给出,而是由本条指令给出下条指令的计算方式,跳跃的结果为当前指令修改PC值,所以下一条指令依然由PC给出。
我们看一道例题,感受一下:
例题:对按字寻址的机器,程序计数器和指令寄存器的位数各取决于___、____
A.机器字长
B.存储器的字数
C.指令字长
D.地址总线宽度
【答案】:B、 C
【解析】:程序寄存器PC存放的是下一条执行指令的地址,即指令在内存中的地址,指令寄存器IR存放的是当前指令的内容,所以程序计数器PC的位数取决于存储器的字数,而指令寄存器IR取决于指令字长。
二、数据寻址具体方式
但是在具体讲之前,我们先要明白几个符号。指令中的地址码并不代表操作数的真实地址,这种地址我们称为形式地址A,而经过数据寻址,我们找到操作数真实的地址,这种地址称为有效地址EA。
其中A代表地址,即编号,而(A)代表A地址中存放的数字。
操作码 | 寻址特征 | 形式地址A |
考点2:简单的寻址
1、直接寻址与间接寻址
如果就这样讲,略显单调,所以小编在这一部分的开头要举一个小例子:假设小伍同学与桃园小区的很多小朋友都是是好朋友,小伍同学每天放学后都要去一个好朋友的家里玩,但是又记不清每一个同学的家庭住址,小伍同学有一个只能记录一个人家庭住址的备忘录,此时我们该如何找到这个“地址”呢?
①直接寻址
第一种方式:备忘录上就是要找的这个好朋友的地址,找到某个好朋友的家庭住址。
这种方式很直接,指令字中的形式地址A就是操作数的真实地址EA,即EA=A。而且只用去一个好朋友的家里,即只用访存一次,而且还特别简单好理解。
②间接寻址
第二种方式:查备忘录,然后先去第一个好朋友A的家里,让这个好朋友告诉自己好朋友B的家庭地址。我不能直接知道地址,但是我可以问别人,让别人告诉我正确的地址。
这种方式指令的地址字段给出的形式地址不是操作数真正的地址,而是操作数有效地址所在的存储单元的地址,也就是说操作数地址的地址,即EA=(A)。
同时,倘若第一个好朋友A也不知道B的地址,他可以告诉你C的地址,并且说“我不知道B住哪儿,但我知道C在哪儿,你去问一问C吧,C没准知道B住在哪儿”。这种情况就是多次间接寻址了。在实际的主存中,主存字第一位为1时,表示去除的仍然不是操作数的地址,这个1就好比是“我不知道B住在哪儿”这句话。
间接寻址的优点为:可扩大寻址范围,因为有效地址EA的位数大于形式地址A的位数,也便于完成子程序的返回,缺点是,要进行多次访存(到好几个小朋友的家里去问),极大的降低了时间。
2、寄存器寻址与寄存器间接寻址
①寄存器寻址
寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA=R,其操作数在由R所指的寄存器内。
寄存器寻址的优点是指令在执行阶段不访问主存,只访问寄存器,引寄存器数量较少,对应地址码长度较小,使得指令字段且不用访存,所以执行速度快,缺点是寄存器价格太贵了,寄存器的个数有限。
②寄存器间接寻址
寄存器间接寻址是指在寄存器R中给出的不是一个操作数,而操作数所在主存单元的地址,即(EA)=R。
寄存器间接寻址的特点是,与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存。注意哦,不出意外的话,就访存一次,《王道考研》书上边没有提到多次寄存器间接寻址。
3、立即寻址
这种类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,又称立即数,采用补码表示。其中#表示立即寻址特征,A就是操作数。
立即寻址的优点是指令在执行阶段不访问主存,指令执行时间最短,缺点为A的位数限制了立即数的范围。
4、隐含寻址
这种类型的指令不明显给出操作数的地址,而是在指令中隐含操作数的地址。例如单地址的指令格式就不明显的在地址段指出第二操作数的地址,而规定累加器ACC作为第二操作数地址,累加器ACC对单地址指令格式来说就是隐含寻址。
隐含寻址的优点是有利于缩短指令字长,缺点是需增加存储操作数货隐含地址的硬件。
来看两道道题目:
例题1:为了简化地址结构,我们采用()
A.立即寻址
B.寄存器寻址
C.隐含寻址
D.间接寻址
【答案】:C
【解析】:隐地址不给出明显的操作数地址,而在指令中隐含操作数的地址,因此可以简化地址结构,而CPU中的寄存器数量不会太多,用很短的编码就可以指定寄存器,因此也能有效的缩短地址段的位数。但是寄存器寻址简化地址结构的效果没有隐含寻址更加厉害,所以当选项中有隐含寻址的时候,就选隐含寻址,没有隐含寻址的时候,就选寄存器寻址
例题2:假设某条指令的第一个操作数采用寄存器间接寻址的方式,指令中给出的寄存器编号为8,8号寄存器的内容为1200H,地址为1200H的单元中的内容为12FCH,地址为12FCH的单元中的内容为38D8H,则该操作数的有效地址为()
A.8
B.1200H
C.12FCH
D.38D8H
【答案】:B
【解析】:我们画一个表,感受一下:
编号/主存号 | 8(寄存器) | 1200H | 12FCH |
存放内容 | 1200H | 12FCH | 38D8H |
由于是寄存器间接寻址,则8号寄存器放的是有效操作数所在的主存地址,即有效地址。故1200H为有效地址,而12FCH为真实操作数。大家千万要注意,题目中问的是有效地址还是操作数!不审题就容易功亏一篑。
考点3:偏移寻址
5、偏移寻址
①相对寻址
相对寻址是把PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于当前PC值的位移量,可正可负,补码表示。
这种寻址的优点是操作数的地址不固定,岁PC值的变化而变化,而且于指令地址见总是差一个固定值,因此便于程序浮动。
但是特别注意:当CPU从存储器中取出一字节是,会自动执行(PC)+1PC,也就是说PC先自增,用这个自增的地址进行偏移,我们看一道例题就能立马明白:
例题:(2009年统考真题)某机器字长为16位,主存按字节编址,转移指令采用相对寻址,由两字节组成,第一字节为操作码字段,第二字段为相对位移量字段,假定取指令时,每去一字节PC自动加1,若某次转移指令所在主存地址为2000H,相对位移量字段的内容为06H,则该转移指令成功转移后的目的地址为()
A.2006H
B.2007H
C.2008H
D.2009H
【答案】:C
【解析】:首先这是2009年的统考题,直接选D(笑死,不会真的有人这么想吧)。首先机器字长为16位,即两个字节,那么CPU取出这一指令时,PC会立马加2,存放2002H,然后经过偏移06H,得到目的地址为2008H。
②基址寻址
基址寻址是将CPU中的基址寄存器BR的内容加上指令格式中的形式地址A二形成操作数的有效地址,即EA=(BA)+A。其中基址寄存器既能采用专用寄存器,又能采用通用寄存器。
至于基址寻址的功能,我们一句话总结为“面向系统,主要用于多道程序或数据分配空间”,很好理解,因为基址寄存器的内容不变,而形式地址则作为偏移量。用户不必为自己的程序存于哪个空间区域而烦恼,系统会安排的,因此有利于多道程序。
③变址寻址
变址寻址是指有效地址EA等于指令字中形式地址A与变址寄存器IX的内容之和,即EA=(IX)+A。
我们依然用一句话总结“面向用户,主要用于处理好数组问题”,变址寄存器的内容由用户设定,但是指令字中的A是不可变的。而且在数组处理过程中,可设定A为数组首地址,不断改变变址寄存器IX的内容,便很容易形成数组中任意一个数据的地址,特别适合编制循环程序。
6、堆栈寻址
堆栈是存储器中一块特定的、满足后进先出原则的存储区,该存储区中读写单元的地址由一个特定的寄存器给出,该寄存器称为SP,即堆栈指针。
三、几种寻址的比较
考点4:对比
寻址方式 | 有效地址 | 访存次数 | 速度 | 用途与特点 |
隐含寻址 | 程序指定 | 0 | \ | 缩短指令字长 |
立即寻址 | A即为操作数 | 0 | 1 | 补码,快 |
直接寻址 | EA=A | 1 | 3 | 快 |
一次间接寻址 | EA=(A) | 2 | 8 | 扩大寻址范围、有利于子程序返回 |
寄存器寻址 | EA=R | 0 | 2 | 快,不访存,指令字长短 |
寄存器一次间接寻址 | EA=(R) | 1 | 3 | 扩大寻址范围 |
相对寻址 | EA=(PC)+A | 1 | 5 | 便于程序浮动 |
基址寻址 | EA=(BR)+A | 1 | 5 | 面向系统 |
变址寻址 | EA=(IX)+A | 1 | 5 | 面向用户,解决数组 |
例题()便于处理数组问题。
A.间接寻址
B.变址寻址
C.相对寻址
D.基址寻址
【答案】:B
【解析】:略,自己重新看上边的表格
好的,本期的计算机考研总结性文章就到此为止啦,感兴趣的好兄弟们快来关注一波,让小编感受到大家的赞赏。