计组2-10 MIPS中32位立即数和寻址

2018-11-28  本文已影响0人  这个杀手蹲了半天有点冷

32位立即数

一般来讲常量不会多余16位,以防万一所以出现了lui(高位)和ori(低位)的指令

lui $s0, 61把61加载到高16位
ori $s0, 52把52加载到低16位

注意:指令addi是将指令最左边的16位立即数复制到高16位去

分支和跳转中的寻址

MIPS的跳转指令j是最简单的寻址方式,除了6位操作码其余26位为地址
分支指令除地址外还须指定两个操作数
bne $s, $s1, Exit
分别占6位、5位、5位、16位,其中程序地址为16位太小,意味着程序不能大于2^16
解决办法是指定一个加到分支地址的寄存器
程序计数器(PC) = 寄存器 + 分支地址
PC包含了原有的16位当前指令地址,其余的16位作为下一个指令地址,这样转移2^15个字到达下一指令
这就是PC相对寻址。

Loop:
  bne $t0, $s5, Exit//这里的Exit是一个分支地址2个字或者8个字节
  xxxxxxxxxxxxxxx//不会执行本行代码,因为PC收到上一行的2个或8个字节的地址,所以本行地址 + 2字 或 8字节,直接跳到Exit
  j Loop
Exit:

此过程中没用使用(+12跳转)也没有用完整目的地址。

如果要跳转很远距离,可在跳转指令附近加一个j Exit
上一篇下一篇

猜你喜欢

热点阅读