JALR x13,0(x1) 跳到x1寄存器里存储的地址,并将下一条指令存在x13寄存器中。 其他伪指令示例: JR x1 => JALR x0, x1, 0 RET => JALR x0, x1, 0 JALR x13 => JALR x1, x13, 0 一般来说,LUI和JALR配合使用可以跳转32位绝对地址范围,AUIPC和JALR配合可以跳转32位相对于PC的地址范围。 图2 JAL...
auipc指令将立即数左移12位加到PC上。这样,可以将auipc中的20位立即数与jalr中的12位立即数组合,将...
jalr ra, ra, 立即数(12位) 或者auipc ra, 立即数(20位) jalr ra, ra, 立即数(12位) 2. 动态预测返回地址 尽管RISC-V 指令集本身并没有对 JAL 或 JALR 中目标寄存器的取值做出限制, 但是根据前面提到的函数调用约定(Calling Convention),JAL/JALR 常用的目标 寄存器有 x1(ra,返回地址)和 x5(t0,替代...
jalr ra,x1,<low12bits> #然后在jalr指令中令源寄存器为X1,立即数为低12位的地址值,从而得到更新后的pc值为我们设置的高20位和低12位的绝对地址值 3.第三种用法是与AUIPC指令相组合,实现相对PC地址的32位偏移量的相对寻址跳转 auipc x1,<Hi20bits> #将寄存器x1的值设置为PC加高20位地址偏移的数值 jalr x...
AUIPC该指令可以将当前PC值加上高位的立即数值的结果保留在目的寄存器中,这也是PC相对寻址的一种方式,如:SET:auipc x10,0指令就是把当前PC值放入x10寄存器 J型指令 JAL指令,该指令保存当前PC值到目的寄存器,然后将当前的PC值加上立即数对应的偏移量得到转移地址值,更新PC寄存器。访问范围是以2bytes为单位的正负2^...
# 装入高位立即数(算术指令)LUI rd, imm# PC加高位立即数(算术指令)AUIPC rd, imm 看这个指令的描述,可以与I-type的短立即数(12bit)配合,得到一个完整的32bit立即数。 1.6 J-type J-type指令操作仅由7位opcode决定,与U-type一样只有一个目的寄存器rd和20位的立即数,但是立即数的位域与U-type的组成不...
AUIPC:创建pc的相对地址,pc+无符号立即数(偏移量)=>rd 寄存器-寄存器: ADD/SUB:rs1(+/-)rs2 => rd SLT/SLTU: 如果rs1<rs2,rd写1; 否则rd为0 AND/OR/XOR: rs1与rs2进行and,or,xor操作 SLL/SRL/SRA: 和"寄存器-立即数"指令一致,将r2的低5位作为立即数即可 ...
jalr的位格式就像寄存器相对的加载和存储。与它们一样,jalr可以与指令一起使用,该指令将基址寄存器的高20位设置为32位分支,可以是绝对地址(使用lui),也可以是PC相对的(使用auipc作为位置无关代码) )。 (使用常量零基址允许单指令调用小的(偏移),固定的正或负地址。) ...
0xffffffff800095bc<+24>:auipcra,0xfffff 0xffffffff800095c0<+28>:jalr1168(ra)#0xffffffff80008a4c<__cpu_suspend_enter>//call__cpu_suspend_enter 0xffffffff800095c4<+32>:beqza0,0xffffffff800095f6<swsusp_arch_suspend+82> ... 小结
比如函数跳转,比如具体在4k之内,可以使用一条jalr指令实现,而如果超过4k的话,则需要auipc+jalr或者lui+jalr两条指令实现。一般在未链接的object文件中,预留的都是指令条数最多的形式,链接之后很大一部分将被优化。如果测试的benchmark如果统计的是object文件,比如CSiBE,那么结果会比实际的要差一些。