Assembly 只有一个参数和偏移量的JALR做什么?

Assembly 只有一个参数和偏移量的JALR做什么?,assembly,disassembly,riscv,Assembly,Disassembly,Riscv,因此,我正在查看一些riscv汇编代码,并试图找出问题所在。 然而,我偶然发现了以下代码: 80001a2: 00000097 auipc ra,0x0 80001a6: 62e080e7 jalr 1582(ra) # 80007d0 <memset> 80001a2:00000097 auipc ra,0x0 80001a6:62e080e7 jalr 1582(ra)#80007d0 我想我理解auipc,即

因此,我正在查看一些riscv汇编代码,并试图找出问题所在。 然而,我偶然发现了以下代码:

 80001a2:   00000097            auipc   ra,0x0
 80001a6:   62e080e7            jalr    1582(ra) # 80007d0 <memset>
80001a2:00000097 auipc ra,0x0
80001a6:62e080e7 jalr 1582(ra)#80007d0
我想我理解auipc,即将个人电脑添加到我的回信地址,但我不理解这里的jalr。 当我查找时,它说用法是:
日航xD,xL(偏移量)

我猜在我的代码中,(ra)是偏移量,但是这里的1582是什么?消息来源?目的地?两者都是?

反汇编程序假定使用正常的默认目标寄存器(
ra
)将返回地址写入,因此保留隐式

因此,
1582(ra)
将是显示目标地址计算的方式,就像加载或存储的寻址模式,
offset(reg)
。RISC-V
jalr
支持一些即时偏移位,使得可以使用
auipc
的2指令序列调用任何目标地址,以获得20位相对偏移量,
jalr
提供其他12位。这很清楚这里发生了什么

如果您想再次检查,请自行拆卸

auipc
指令中的
0x0
偏移量可能是由于
memset
已在附近结束。这些看起来像“real”地址,所以它不是一个未链接的
.o
。我猜这是一个静态链接的可执行文件?直到链接时才知道
memset
会如此接近的事实;我想优化到
jal
相对分支已经太晚了。)

RISC-V指令集手册第一卷:用户级ISA有一个伪指令表,其中指出
jalr rs
扩展到
jalr x1,rs,0
(其中
x1
只是
ra
的不同名称)。因此,通过扩展,
jalr-rs,imm
应该扩展到
jalr-x1,rs,imm