将 64 位地址加载到寄存器中
Loading a 64 bit address into a register
我需要让我的 RISC-V 程序集即时编写指令 -(这是 Forth,因此用户可以扩展语言)。
当我使用 32 位 ISA 时,这相对简单,假设我想从我当前正在写入的地址获得偏移量,我会做一些事情,比如写出操作代码:
lui s8, [upper 20 bits of address]
addi s8, s8, [offset]
当我有 64 位地址时,这不再有效,因为我必须写出实际的操作码,而不仅仅是使用像
这样的汇编技巧
li s8, address
我很困惑如何做。正确的做法是什么?
基本上我通过将数字的高 32 位加载到低 32 位,然后左移 32 位并加载低 32 位来解决这个问题。
这是一个典型的输出组件:
0x0000003ff7dbd040: li s8,63 #0x3f
0x0000003ff7dbd044: slli s8,s8,0x20 #shift left 32 bits
0x0000003ff7dbd048: lui t0,0xf7dbd #upper half load
0x0000003ff7dbd04c: ori t0,t0,0
0x0000003ff7dbd050: slli t0,t0,0x20
0x0000003ff7dbd054: srli t0,t0,0x20
0x0000003ff7dbd058: or s8,s8,t0
我需要让我的 RISC-V 程序集即时编写指令 -(这是 Forth,因此用户可以扩展语言)。 当我使用 32 位 ISA 时,这相对简单,假设我想从我当前正在写入的地址获得偏移量,我会做一些事情,比如写出操作代码:
lui s8, [upper 20 bits of address]
addi s8, s8, [offset]
当我有 64 位地址时,这不再有效,因为我必须写出实际的操作码,而不仅仅是使用像
这样的汇编技巧li s8, address
我很困惑如何做。正确的做法是什么?
基本上我通过将数字的高 32 位加载到低 32 位,然后左移 32 位并加载低 32 位来解决这个问题。
这是一个典型的输出组件:
0x0000003ff7dbd040: li s8,63 #0x3f
0x0000003ff7dbd044: slli s8,s8,0x20 #shift left 32 bits
0x0000003ff7dbd048: lui t0,0xf7dbd #upper half load
0x0000003ff7dbd04c: ori t0,t0,0
0x0000003ff7dbd050: slli t0,t0,0x20
0x0000003ff7dbd054: srli t0,t0,0x20
0x0000003ff7dbd058: or s8,s8,t0