一.本文的主要内容介绍:

        ①计算机当中指令的组成(操作码OP,操作特征X,形式地址A)

        ②指令寻址方式(顺序寻址,跳跃寻址)

        ③指令的十大数据寻址方式:①直接寻址②间接寻址③寄存器寻址④寄存器间接寻址⑤隐含寻址


二.指令的组成     

        指令一般由操作码OP,寻址特征X,形式地址码A组成。比较简单,用表格表示如下:

操作码OP

寻址特征X

形式地址码A

上面为单地址指令组成,多地址指令则如下表格所示:

操作码OP

寻址特征X1

形式地址码A1

寻址特征X2形式地址码A2......

寻址特征Xn

形式地址码An

三.指令寻址的方式

        指令寻址指的是:找到下一条指令所在地址的过程。

        指令寻址主要有两种寻址方式,分别是:顺序寻址和跳跃寻址。

        顺序寻址:通过程序计数器PC自动+"1"来获得下一条指令的地址,即:PC+"1"->PC

        跳跃寻址:通过转移指令来获得下一条指令的地址,即:PC=X(X为转移指令当中的目标地址)。


四.十大数据寻址方式及其分析:

所谓数据寻址,就是通过形式地址A找到有效地址EA的过程,有效地址则是操作数所在的地址,*(EA)=操作数。

        分别为以下十种:

        ①直接寻址

                形式地址A就是有效地址EA。(EA=A)

                操作数 = *(A)  

                优点:寻址期间只需访问一次主存。

                缺点:由于有效地址位数有限,所以寻址空间非常有限。

                访问内存频率:取指令1次+访问地址A所在的主存空间,总计2次。

        ②(一重)间接寻址

                形式地址A指向的地址为有效地址。(*(A)=EA)

                操作数=*(*(A))

                优点:有效地址位数更多,寻址空间大。

                缺点:需要访问多次主存。

                访问内存频率:取指令1次+访问地址A所在的主存空间得到EA1次+访问EA所在的主存空间1次,总计3次。

        ③寄存器寻址

                形式地址A指向的是寄存器编号Ri,寄存器编号本身就是有效地址Ri。( A = EA = Ri )

                操作数=*( Ri )

                优点:寻址速度快,操作数在寄存器里面,寻址期间无需访问主存。

                缺点:寄存器数目有限,硬件成本高。

                访问内存频率:取指令1次,总计1次。

        ④寄存器间接寻址

                形式地址A指向的是寄存器编号Ri,寄存器当中的内容*(Ri)是有效地址EA。

                操作数=*(*( Ri ) )

                优点:寻址速度比一般的间接寻址要快。

                缺点:需要多次访存,寄存器硬件数目有限。

                访问内存频率:取指令1次,访问寄存器当中的形式地址EA1次,总计2次。

        ⑤隐含寻址

                操作数所在位置隐含在操作码里面。

                操作数=*(X),X为操作码OP当中指明的某个寄存器(ACC,MQ,X)。

                优点:寻址无需访问主存。

                缺点:需要对应的寄存器硬件,成本高。

                访问内存频率:取指令1次,总计1次。

        ⑥立即数寻址

                形式地址A本身就是操作数。

                操作数=A(A通常为补码)

                优点:寻址过程无需访问主存。

                缺点:形式地址A(补码)位数有限,所能表示的范围有限。

                访问内存频率:取指令1次,总计1次。

        ⑦基址寻址

                基址寄存器BR当中的内容+形式地址A,即为有效地址。EA = (BR)+A

                操作数 = *((BR)+A)

                BR:基址寄存器(Base Address Register),存储的是程序入口处的指令的地址,由操作系统(OS)来控制。

                优点:无论程序存储在内存当中何处,都可以正常执行,方便了程序的在内存当中的浮动。

                访问内存频率:取指令1次+访问主存一次,总计2次。

        ⑧变址寻址

                变址寄存器IX当中的内容+形式地址A,即为有效地址。EA = (IX)+A

                操作数=*((IX)+A)

                IX:变址寻址寄存器(Index Register),存储的是地址偏移量,为了方便讲解,我们假设有以下C++程序段:        

int sum=0;
int arr[100]={0};
for(int i=0;i<100;i++)
{
    sum+=arr[i];
}

此时的变量i就储存在变址寄存器当中,形式地址A为数组arr的首地址,通过对i进行++,就可以很方便地访问数组arr的元素了。很明显,IX的值由程序员来控制,这与BR由OS来控制不同,要注意区分。

        优点:可以方便地编写循环类的程序

        访问内存频率:取指令1次+访问主存一次,总计2次。

        ⑨相对寻址

        程序计数器PC当中的内容+形式地址A,即为有效地址EA。EA =(PC)+ A(此时的PC指向的是下一条指令的地址,而非当前指令的地址)

        操作数=*((PC)+A)

        优点:当需要执行转移指令的时候,可以使用相对寻址的方式快速实现

         访问内存频率:取指令1次+访问主存一次,总计2次。


基址/变址/相对寻址都可以归类为偏移寻址,其寻址过程可以如下图所示:


         ⑩堆栈寻址

        通过SP(Stack Point)指针来确定操作数的位置。

        当进行出栈时,有效地址EA = ( SP )

        当进行入栈时,有效地址EA= (SP)+"1"  /  EA = (SP) - "1" ,当栈顶元素在高地址时候为+ "1",栈顶元素在低地址为 - "1" 。

堆栈分为两种:

        1)硬堆栈:使用一组寄存器来专门当做堆栈,再使用一个特殊寄存器来存放SP指针的内容

        2)软堆栈:在内存当中划分一块空间来当做堆栈,再使用一个通用寄存器来存放SP指针

        访问内存频率:当堆栈实现方式为硬堆栈时,只需在取指令时访存1次,总计1次;当堆栈实现方式为软堆栈时,取指令时访存一次,访问堆栈指针所指向地址时访问1次,总计2次。

        堆栈寻址可以认为是特殊的寄存器间接寻址,其寻址过程可以参考寄存器间接寻址图:


五.不同数据寻址方式访问内存频率总结

数据寻址方式访问内存频率分析访问内存次数总计
直接寻址取指令1次+访问主存1次2次
间接寻址取指令1次+访问主存2次3次
寄存器寻址取指令1次1次
寄存器间接寻址取指令1次,访问主存1次2次
隐含寻址取指令1次1次
立即数寻址取指令1次1次
基址寻址取指令1次,访问主存1次2次
变址寻址取指令1次,访问主存1次2次
相对寻址取指令1次,访问主存1次2次
软堆栈寻址取指令1次,访问主存1次2次
硬堆栈寻址取指令1次1次

数据寻址方式访问内存次数
寄存器寻址,隐含寻址,立即数寻址,硬堆栈寻址1次
直接寻址,寄存器间接,基址寻址,变址寻址,相对寻址,软堆栈寻址2次
间接寻址3次

        好了,以上就是本文的全部内容了,如果您觉得本文的内容对你有帮助的话,不妨给我一个大大的赞吧~~~您的支持和鼓励就是我学习的最大动力,如果您想了解更多关于计算机的硬核知识,不妨关注我,这里是站长李蔚,一个专注于C/C++的程序员。                        

更多推荐