assembly 如何在RiscV64汇编中加载大于0x7FFFFFFF的符号的绝对地址

iq0todco  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(160)

我正在写一个内核,我需要在0x7FFFFFFF之上进行自重定位。为此,我需要使用绝对寻址来引用内核的开始和结束以及一个符号,在重定位之后,执行将在那里继续。我一直无法找到任何方法来实现这一点。可以做到吗?有解决方法吗?

bis0qfac

bis0qfac1#

我找到的唯一方法是取加载地址,然后从目标地址中减去这个值,然后将这个偏移量加到任何相对地址上,得到绝对地址。

3zwtqj6y

3zwtqj6y2#

解决方法:在代码后放置一个64位常量(地址),然后通过“ld”指令获取地址。解决方法可编写如下:

# Use load instruction get address of _symbol
ld t1, symbol_addr
jr t1
...
# A large pc for _symbol
_symbol:
    nop
    ...
.data
# symbol_addr equals to the address of _symbol
symbol_addr: .dowrd _symbol

数据symbol_addr将被自动计算为_symbol的地址,该地址可能是一个大地址,然后使用“ld”指令加载symbol_addr,寄存器“t1”等于symbol_addr,“jr”指令将工作。
类似的问题:在RISC-V 64中,如何通过绝对寻址加载符号的地址?

相关问题