目录
https://blog.csdn.net/weixin_45792450/article/details/109314693
寻址方式概述
一般来讲,程序由数据和指令构成,指令指导操作,数据提供操作对象,指令和数据在运行时都是存在内存中的,对它们的寻址需要特定的方法。
寻址方式分为指令寻址和数据寻址。对指令地址的寻找称为指令寻址,对数据地址的寻找称为数据寻找。
指令寻址
顺序寻找:按指令存储顺序自动寻址,如程序计数器PC寻址。内存一般按字节(Byte)编址,一条指令32位,4个字节,那么下一条指令的首地址是上一条指令首地址加上4,程序计数器PC由此直接算出下一条指令的地址。
寄存器寻址:指令地址在寄存器中,访问寄存器获得指令地址。MIPS寄存器也是32位的,可以直接存储32位的指令地址,2^32字节为4GB,相对MIPS处理器的应用领域来说已经够了
PC相对寻址:给出一个立即数,和PC中地址相加得到指令地址。比如要找当前指令的向后偏移两个指令长度的指令,只需要当前指令地址加上8(=2*4)即可得到。这种方式的特点是以PC中存储的指令地址为基准,进行一个常数的偏移
伪直接寻址:参考MIPS指令中的跳转指令,26位操作数左移2位,与PC高4位组成新的32位地址。对于跳转指令,由于32位里面,高位的6位已经被指令操作码占据,那么关于操作数据只能放低位的26位,显然不够32位地址,只能让这26位先左移两位变28位,然后将PC中的高4位充当其高4位,以此扩充成32位指令地址
后三种称为跳跃寻址,与顺序寻址相对。
数据寻址
寄存器寻址:数据存在寄存器当中,访问寄存器即可拿到数据。MIPS寄存器的32位,就可以存储指令地址,又可以存储数据地址,而通用寄存器就32个,均按自然数从0到31排序,只需5个二进制数即可表示所有寄存器,也就是在指令中只需要5位即可指出操作数
立即数寻址:数据就就是当前指令的立即数,直接使用即可。有立即数的指令格式是I型指令,立即数占16位,相对普通的操作,16位立即数已经够用了
基址寻址:又叫偏移寻址,通过立即数与基址寄存器的值相加得到数据的地址,然后通过数据传输指令进行数据操作。一般基址寄存器的地址指向内存的某个有固定功能的分区,程序的数据和指令以该地址为起始,进行存取,这种做法可以方便调度内存分配。
其他
当然还有更多的指令寻址和数据寻找方式,不过MIPS处理器中常见的寻找方式即上述几种。其他架构下的处理器还有各种各样的寻找方式,以适应各种不同的应用场景。