立即操作数,immediate operand,是我觉得在汇编中比较难理解的概念之一了。立即数简单理解就是被编译在指令中的,能被处理器立即使用的常数。在CPU的算数逻辑计算单元 (ALU) 中,能接触到的值只能是来自寄存器的值或者是立即数,他没法儿直接去内存中获取值,内存中的数值必须先被取到寄存器中,然后才能被运算。比如下面这几句C代码:
ALU要处理a和b的值,就必须先把他们的值取到寄存器中,因为a和b都是变量,他们在内存中都有自己的地址。但是下面这条命令中的5就是一个立即数,5这个常数会被编译到机器指令中,CPU在处理的时候无需去内存单独获取。
如下图RISC-V的6种汇编指令类型中,除了第一种纯Register操作的R-type指令外,多达5种都涉及到了立即数的操作。但是我们也看到像I-type指令中立即数只有12个bit,只能表示[-2048, 2047)的范围,对于超出这个范围的立即数如何处理呢?
注意U-type指令类型就是为此而生的,将一个大立即数的高20位先放到寄存器rd中,然后再将rd与I-type指令中的低12位立即数相加,就得到了32位的立即数。这个过程比较复杂,RISC-V提供了一个伪指令li来表示这一系列操作。
|