MIPS有5种寻址方式:寄存器寻址,立即数寻址,基址寻址,相对PC寻址和伪直接寻址。
寄存器寻址
R指令都用寄存器寻址。寄存器作为操作数,直接通过读取相应寄存器获取所需数值。
立即数寻址
一些I指令的寻址方式。16位立即数与寄存器一起作为操作数被获取。
基址寻址
存储器中的地址通过基址与偏移量相加得到,从而获取存在 存储器中的操作数。
相对PC寻址
条件分支指令在进行跳转时使用相对PC寻址,从而得到PC新值。
beq register1, register2, label
这里label代表的并不是PC的新值,他是一个16位立即数,无法保存32位地址。它代表的是目标地址减去跳转前下一条指令地址(跳转前PC + 4)所获得的差值再除以4所得到的数值,也就是夹在分支指令和目标指令之间的指令数目。
当执行跳转时,处理器会将label所代表的立即数进行符号扩展并乘以4,再将结果与(跳转前PC + 4)相加,得到PC新值,从而找到目标地址。
伪直接寻址
j与jal都用这个寻址方式。直接寻址是通过指明32位地址从而进行跳转。但是MIPS指令使用32位指令,其中包括6位操作码,用来指明地址的就只剩下26位数。但是由于指令是字对齐的,每条指令地址都是4的倍数,所以地址的最低2位固定为0,我们可以直接舍弃地址的最低两位,把地址从低到高的第3位数到第28位数存在26位立即数中,当使用地址时再补上两位0。这样只有最高4位数存不进立即数。
MIPS采取折中办法,将(跳转前PC + 4)的最高四位直接当做地址的最高四位补全地址。这样导致跳转范围受到限制,但也实现了伪直接寻址。