常见的数据寻址方式
直接寻址
假设指令字长=机器字长=存储字长,操作数为3
一地址指令
直接寻址:指令字中的形式地址A就是操作数的真实地址EA,即EA=A;
一条指令的执行:取指令 访存1次;执行指令 访存1次;暂不考虑存结果;共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改.
间接寻址
假设指令字长=机器字长=存储字长,操作数为3
间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A);
一次间接寻址
多次间接寻址
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)便于编制程序(用间接寻址可以方便地完成子程序返回)
缺点:需要多次访存,访问速度过慢,这种寻址方式不是特别常用
寄存器寻址
假设指令字长=机器字长=存储字长,操作数为3
寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA=Ri,其操作数在由Ri所指的寄存器内。
一条指令的执行:取指令 访存一次;执行指令 访存0次;暂不考虑存结果,共访存一次;
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。
缺点:寄存器价格昂贵,计算机中寄存器个数有限;
寄存器间接寻址
假设指令字长=机器字长=存储字长,操作数为3
寄存器间接寻址:寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri).
一条指令的执行:取指令 访存一次;执行指令 访问一次;暂不考虑结果,共访问2次;
特点:与一般间接寻址相比速度较快,但指令的执行阶段需要访问内存.
隐含寻址
隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址;
优点:有利于缩短指令字长
缺点:需增加存储操作数或隐含地址硬件
立即寻址
假设指令字长=机器字长=存储字长,操作数为3
作数本身,又称为立即数,一般采用补码形式。#表示立即寻址特征。一条指令的执行:取指令 访存一次。执行指令 访存0次。暂不考虑结果,共访存一次。
优点:指令执行阶段不访问主存,指令执行时间最短。
缺点:A的位数限制了立即数的范围
偏移寻址
基址寻址
基址寻址:将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A;其中基址寄存器既可采用专用寄存器,又可采用通用寄存器
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。在程序执行中,基址寄存器的内容不变,形成地址可变。采用通用寄存器作为基址寄存器时,可由用户决定哪个基址寄存器,但其内容仍由操作系统确定
基址寻址的优点是可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序但偏移量(形式地址A)的位数较短。
例子:
这样可以使用直接寻址就可以完成,主存地址为0,指令的形式地址为5,则直接指向主存地址为5的地方,但是如果程序从地址100开始存放
使用直接寻址是不行的,这时候我们需要使用基址寻址EA=(BR)+A;BR=0000 0000 0110 0100对应十进制100;EA=100+5=105;采用基址寻址无需修改指令中的地址码;变量a的实际存放地址为105
变址寻址
变址寻址:有效地址EA等于指令字中的形式地址A与地址寄存器IX的内容相加之和,即EA=(IX)+A,其中IX可为贬址寄存器(专用),也可用通用寄存器作为变址寄存器
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址)。
优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可狠容易形成数中任一数据的地址,特别适合编制循环程序。
相对寻址
相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示.
问题:我们还是这个代码块,随着代码越写越多,你想挪动foe循环的位置
假设我们随便挪个位置
主存M+3的位置的地址码是跳转到主存地址2的位置,可是这个位置已经不属于这个内存卡,会出现错误,这时候我们就需要使用相对寻址,取出M+3这条指令之后,PC会自动往后+1,即M+4的位置,如果让我们的M+4,跳转到M的位置即-4即可
优点:操作数的地址不是固定的,它随PC值的变化而变化,且指令地址之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用于转移指令.
堆栈寻址
堆栈寻址;操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址
堆栈是存储器(或专用寄存器组)中一块特定的按"后进先出"原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)
这种堆栈称为硬堆栈,这种会更快,成本会更高
在主存中划分的则是软堆栈
对以上10种进行总结
CISC和RISC
指令系统朝两个截然不同的方向发展:一是增强原有指令的功能,
设置更为复杂对的新指令实现软件功能的硬件,这类机器称为复杂指令系统计算机(CISC),典型的有采用X86架构的计算机;二是减少指令种类和简化指令功能,提高指令的执行速度,这类机器称为精简指令系统计算机(RISC),典型的有ARM,MIPS架构的计算机
CISC的主要特点;
1.指令系统复杂庞大,指令数目一般为200条以上
2.指令的长度不固定,指令格式多,寻址方式多
3.可以访存的指令不受限制
4.各种指令使用频度相差很大
5.各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成
6.控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制
7.难以用优化编译生成高效的目标代码程序
一味地追求指令系统的复杂和完备程度不是提高计算机性能的唯一途径。后来人们发现,一味地追求指令系统的复杂和完备程度不是提高计算机性能的唯一途径.对传统CISC指令系统的测试表明,各种指令的使用频率相差悬殊,大概只有20%的比较简单的指令被反复使用,约占整个程序的80%;而80%左右的指令则是很少使用,约占整个程序的20%,从这一事实出发,人们开始了对指令系统合理性的研究,于是RISC随之诞生.
精简指令系统计算机(RISC)
精简指令系统计算机的中心思想是要求指令系统简化,尽量使用寄存器-寄存器操作指令,指令格式力求一致。RISC的主要特点如下:
1.选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现
2.指令长度固定,指令格式种类少,寻址方式种类少
3.只有Load/store指令访存,其余指令的操作都在寄存器之间进行
4.CPU中通用寄存器的数量相当多
5.RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成
6.以硬布线控制为主,不用或少用微程序控制
7.特别重视编译优化工作,以减少程序执行时间