指令系统当中指令的组成,寻址方式以及十大数据寻址方式
一.本文的主要内容介绍:
①计算机当中指令的组成(操作码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++的程序员。
更多推荐
所有评论(0)