计算机组成原理 第六章(指令系统)

您所在的位置:网站首页 8051pc寻址范围 计算机组成原理 第六章(指令系统)

计算机组成原理 第六章(指令系统)

2024-07-11 01:25| 来源: 网络整理| 查看: 265

写在前面:

本系列笔记主要以《计算机组成原理(唐朔飞)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。

视频链接:计算机组成原理(哈工大刘宏伟)135讲(全)高清_哔哩哔哩_bilibili

一、概述

        寻址方式是指确定本条指令的数据地址以及下一条将要执行的指令地址的方法,它与硬件结构紧密相关,而且直接影响指令格式和指令功能。

        寻址方式分为指令寻址和数据寻址两大类。

二、指令寻址 1、顺序寻址

        顺序寻址可通过程序计数器PC加1,自动形成下一条指令的地址,如下图所示。

        如果程序的首地址为0,只要先将0送至程序计数器PC中,启动机器运行后,程序便按0、12、3、7、8、9…顺序执行,其中第1、2、3号指令地址均由PC自动形成,因第3号地址指令为“JMP 7”,故执行完第3号指令后,便无条件将7送至PC,因此,此刻指令地址跳过4、5、6三条直接执行第7条指令,接着又顺序执行第8条、第9条等指令。

2、跳跃寻址

        跳跃寻址通过转移类指令实现,如上图所示的“JMP 7”指令,它直接把程序转移到下一条需执行指令的地址。

三、数据寻址

        数据寻址方式种类较多,在指令字中必须设一字段来指明属于哪一种寻址方式。指令的地址码字段通常都不代表操作数的真实地址,故把它称为形式地址,记作A;操作数的真实地址称为有效地址,记作EA,它是由寻址方式和形式地址共同来确定的。由此可得指令的格式应下图所示。(假设指令字长、存储字长、机器字长均相同,以此为条件进行介绍)

1、立即寻址

        立即寻址的特点是操作数本身设在指令字内,即形式地址A不是操作数的地址,而是操作数本身,又称之为立即数。

        数据是采用补码形式存放的,如下图所示,图中“#”表示立即寻址特征标记。

        它的优点在于只要取出指令,便可立即获得操作数,这种指令在执行阶段不必再访问存储器,不过A的位数限制了这类指令所能表述的立即数的范围。

2、直接寻址

        直接寻址的特点是指令字中的形式地址A就是操作数的真实地址EA,即EA=A,如下图所示。

        它的优点是寻找操作数比较简单,也不需要专门计算操作数的地址,在指令执行阶段对主存只访问一次。它的缺点在于A的位数限制了操作数的寻址范围,而且操作数的地址又不易修改,必须修改A的值,才能修改操作数的地址。

3、隐含寻址

        隐含寻址是指指令字中不明显地给出操作数的地址,其操作数的地址隐含在操作码或某个寄存器中,例如一地址格式的加法指令只给出一个操作数的地址,另一个操作数隐含在累加器ACC中,这样累加器ACC成了另一个数的地址。

        由于隐含寻址在指令字中少了一个地址,因此这种寻址方式的指令有利于缩短指令字长,不过需要添加存储操作数或隐含地址的硬件。

4、间接寻址

        间接寻址是指指令字中的形式地址不直接指出操作数的地址,而是指出操作数有效地址所在的存储单元地址,即EA=(A)。

        下左图为一次间接寻址,即A地址单元的内容EA是操作数的有效地址;下右图为两次间接寻址,即A地址单元的内容A_{1}还不是有效地址,而由A_{1}所指单元的内容EA才是有效地址。

这种寻址方式与直接寻址相比,它扩大了操作数的寻址范围,因为A的位数通常小于指令字长,而存储字长可与指令字长相等。若设指令字长和存储字长均为16位,A为8位,显然直接寻址范围为2^{8},一次间接寻址的寻址范围可达2^{16};当多次间接寻址时,可用存储字的首位来标志间接寻址是否结束,如下右图中,当存储字首位为“1”时表明还需继续访存寻址,当存储字首位为“0”时表明该存储字即为EA,由此可见,存储字首位不能作为EA的组成部分,因此,它的寻址范围为2^{15}

        间接寻址的第二个优点在于它便于编制程序。例如,用间接寻址可以很方便地完成子程序返回,如下图所示,图中表示两次调用子程序,只要在调用前先将返回地址存入子程序最末条指令的形式地址A的存储单元内,便可准确返回到原程序断点,第一次调用前使[A]=81,第二次调用前使[A]=202,这样,当第一次子程序执行到最末条指令“JMP @A”(“@”为间接寻址特征位)便可无条件转至81号单元,同理,第二次执行完子程序后便可返回到202号单元。

        间接寻址的缺点在于指令的执行阶段需要访存两次(一次间接寻址)或多次(多次间接寻址),致使指令执行时间延长。

5、寄存器寻址

        在寄存器寻址的指令字中,地址码字段直接指出了寄存器的编号,即EA=R_{i},如下图所示,其操作数在由R_{i}所指的寄存器内。

        由于操作数不在主存中,故寄存器寻址在指令执行阶段无须访存,减少了执行时间。由于地址字段只需指明寄存器编号(计算机中寄存器数有限),故指令字较短,节省了存储空间,因此寄存器寻址在计算机中得到广泛应用。

6、寄存器间接寻址

        下图示出了寄存器间接寻址的过程,图中R_{i}中的内容不是操作数,而是操作数所在主存单元的地址号,即有效地址EA=R_{i}。与寄存器寻址相比,采用寄存器间接寻址的指令的执行阶段还需访问主存;与一次间接寻址相比,因有效地址不是存放在存储单元中,而是存放在寄存器中,故称其为寄存器间接寻址,它比间接寻址少访存一次。

7、基址寻址

        基址寻址需设有基址寄存器BR,其操作数的有效地址EA等于指令字中的形式地址A与基扯寄存器中的内容(称为基地址)相加,即EA=A+(BR)。

        基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,在程序执行的过程中基址寄存器的内容不变,形式地址A可变。

        基址寄存器可采用隐式的和显式的两种。所谓隐式(上左图),是在计算机内专门设有一个基址寄存器BR,使用时用户不必明显指出该基址寄存器,只需由指令的寻址特征位反映出基址寻址即可;显式(上右图)是在一组通用寄存器里,由用户明确指出哪个寄存器用作基址寄存器,存放基地址。

        基址寻址可以扩大操作数的寻址范围,因为基址寄存器的位数可以大于形式地址A的位数。当主存容量较大时,若采用直接寻址,因受A的位数限制,无法对主存所有单元进行访问,但采用基址寻址便可实现对主存空间的更大范围寻访。例如,将主存空间分为若干段,每段首地址存于基址寄存器中,段内的位移量由指令字中形式地址A指出,这样操作数的有效地址就等于基址寄存器内容与段内位移量之和,只要对基址寄存器的内容做修改,便可访问主存的任一单元。

        基址寻址在多道程序中极为有用,用户可不必考虑自己的程序存于主存的哪一空间区域,完全可由操作系统或管理程序根据主存的使用状况,赋予基址寄存器内一个初始值(即基地址),便可将用户程序的逻辑地址转化为主存的物理地址(实际地址),把用户程序安置于主存的某一空间区域。例如,对于一个具有多个寄存器的机器来说,用户只需指出哪一个寄存器作为基址寄存器即可,至于这个基址寄存器应赋予何值,完全由操作系统或管理程序根据主存空间状况来确定,在程序执行过程中,用户不知道自己的程序在主存的哪个空间,用户也不可修改基址寄存器的内容,以确保系统安全可靠地运行。

8、变址寻址

        变址寻址与基址寻址极为相似,其有效地址EA等于指令字中的形式地址A与变址寄存器区的内容相加之和,即EA=A+(IX)。

        显然,只要变址寄存器位数足够,也可扩大操作数的寻址范围。

        在变址寻址中,变址寄存器的内容是由用户设定的,在程序执行过程中其值可变,而指令字中的A是不可变的。变址寻址主要用于处理数组问题,在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。下图所示的是分别用直接寻址和变址寻址编制的求N个数平均值的程序,可见采用变址寻址在大多数类似情况下可以减少程序指令的条数,从而减少指令所占的存储空间。

        变址寻址还可以与其它寻址方式结合使用,比如基址寻址、间接寻址。

9、相对寻址

        相对寻址的有效地址是将程序计数器PC的内容(即当前指令的地址)与指令字中的形式地址A相加而成,即EA=(PC)+A。

        相对寻址常被用于转移类指令,转移后的且标地址与当前指令有一段距离,称为相对位移量,它由指令字的形式地址A给出,故A又称位移量,位移量A可正可负,通常用补码表示。

        相对寻址的最大特点是转移地址不固定,它可随PC值的变化而变,因此,无论程序在主存的哪段区域,都可正确运行,对于编写浮动程序特别有利。

        注:“*”为相对寻址特征。

        相对寻址也可与间接寻址配合使用。

10、堆栈寻址

        堆栈寻址要求计算机中设有堆栈,堆栈既可用寄存器组(称为硬堆栈)来实现,也可利用主存的一部分空间作堆栈(称为软堆栈)。

        堆栈的运行方式为先进后出或先进先出两种,先进后出型堆栈的操作数只能从一个口进行读或写。

        以软堆栈为例,可用堆栈指针SP(Stack Point)指出栈顶地址,也可用CPU中一个或两个寄存器作为SP,操作数只能从栈顶地址指示的存储单元存或取。可见堆栈寻址也可视为一种隐含寻址,其操作数的地址总被隐含在SP中。堆栈寻址也可视为寄存器间接寻址,因SP可视为寄存器,它存放着操作数的有效地址。

        上图分别表示进栈“PUSH A”和出栈“POP A”的过程。(对于出栈,虽然主存的相应位置还有数据存储,但从逻辑上看这个数据已经没办法访问了,除非通过进栈操作将栈顶指针移回原位,但这时原数据也会被新数据覆盖)

        由于SP始终指示着栈顶地址,因此不论是执行进栈还是出栈,SP的内容都需要发生变化。若栈底地址大于栈顶地址,则每次进栈(SP)-\Delta \to SP,每次出栈(SP)+\Delta \to SP。△的取值与主存编址方式有关,若按字编址则取1,若按字节编址则需根据存储字长是几个字节构成才能确定△,例如字长为16位,则\Delta =16/8=2



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3