只有 1 个参数和偏移量的 JALR 有什么作用?
What does JALR with only 1 argument and offset do?
所以我正在查看一些 riscv 汇编代码,基本上是想找出问题所在。
但是,我偶然发现了以下代码:
80001a2: 00000097 auipc ra,0x0
80001a6: 62e080e7 jalr 1582(ra) # 80007d0 <memset>
我想我明白auipc,即将电脑添加到我的return地址,但是我不明白这里的jalr。
当我查找它时,它说用法是:
jalr xD, xL(偏移量)
我在我的代码中猜测 (ra) 是偏移量,但是这里的 1582 是什么?来源?目的地?两个?
大概反汇编程序假定正常的默认目标寄存器 (ra
) 将 return 地址写入其中,因此保留隐式。
所以 1582(ra)
将是它显示目标地址计算的方式,例如加载或存储的寻址模式,offset(reg)
。 RISC-V jalr
支持一些立即偏移位,使得可以使用 auipc
的 2 指令序列调用任何目标地址以获得 20 位的相对偏移,并且 jalr
供应其他 12 个。这很清楚这里发生了什么。 Understanding the auipc+jalr sequence used for function calls
如果要double-check,自己拆机
(auipc
指令中的 0x0
偏移量可能是由于 memset
在附近结束。这些看起来像“真实”地址,所以它不是一个 unlinked .o
。我猜这是一个 statically-linked 可执行文件?直到 link 时间才知道 memset
如此接近的事实;太晚了我猜优化到 jal
相对分支。)
所以我正在查看一些 riscv 汇编代码,基本上是想找出问题所在。 但是,我偶然发现了以下代码:
80001a2: 00000097 auipc ra,0x0
80001a6: 62e080e7 jalr 1582(ra) # 80007d0 <memset>
我想我明白auipc,即将电脑添加到我的return地址,但是我不明白这里的jalr。
当我查找它时,它说用法是:
jalr xD, xL(偏移量)
我在我的代码中猜测 (ra) 是偏移量,但是这里的 1582 是什么?来源?目的地?两个?
大概反汇编程序假定正常的默认目标寄存器 (ra
) 将 return 地址写入其中,因此保留隐式。
所以 1582(ra)
将是它显示目标地址计算的方式,例如加载或存储的寻址模式,offset(reg)
。 RISC-V jalr
支持一些立即偏移位,使得可以使用 auipc
的 2 指令序列调用任何目标地址以获得 20 位的相对偏移,并且 jalr
供应其他 12 个。这很清楚这里发生了什么。 Understanding the auipc+jalr sequence used for function calls
如果要double-check,自己拆机
(auipc
指令中的 0x0
偏移量可能是由于 memset
在附近结束。这些看起来像“真实”地址,所以它不是一个 unlinked .o
。我猜这是一个 statically-linked 可执行文件?直到 link 时间才知道 memset
如此接近的事实;太晚了我猜优化到 jal
相对分支。)