J-format 指令

J型指令只有 jal 一条, 其含义为 Jump and link

格式为 jal rd label 即将PC + 4的值存入rd(通常为ra), 并将PC的值设为PC + label

其二进制格式为:

image-20251029233335110

其立即数为20位, 因此可以跳转到 [PC - 1 MiB, PC + 1 MiB] 这个范围内的任意 2 字节对齐的地址。

U-format 指令

  • lui (Load Upper Immediate) - 加载高位立即数
    • 指令含义: lui rd, immediate
    • 其完成的具体操作:
      1. immediate 放入 rd 的高20位
      2. rd 的低20位清零.

我们如果要完成向某寄存器加载32位立即数, 那么要完成的是:

  • lui 设置高20位
  • addi 设置低12位

注意, addi的12位立即数是有符号数, 因此如果要加载的32位立即数的第11位为1, 那么lui 的立即数需要加1来补偿.

  • auipc (Add Upper Immediate to PC)
    • 指令含义: 将高位立即数加到pc上 auipc rd, imm
    • 其完成的具体操作:
      1. 将立即数左移20位
      2. 将立即数和PC 相加
      3. 将结果存入rd

​ 同样, 如果要加载32位地址, 要把lui的立即数 +1 补偿.

原子化

有指令 lr.w, sc.w, 其用处分别为尝试读入, 尝试写入.

考虑题目: image-20251030105719158

setmax:
    loop:
        lr.w x5, x10
        bge x5, x11, end
		sc.w x6, x11, x10
		bne x6, 0, loop
end:

过程调用

过程调用应当做以下几件事:

func:
	addi sp, sp, -16
	sw ra, 0(sp)
	sw x10, 4(sp)
	jal ra, func2
	lw ra, 0(sp)
	lw x10, 4(sp)
	addi sp, sp, 16
	jalr x0, 0(ra)

在函数开头开栈帧, 保存自己应当保存的寄存器. 在函数结尾恢复栈帧.