我需要让我的 RISC-V 程序集即时写入指令 - (这是 Forth,以便用户可以扩展语言)。 当我使用 32 位 ISA 时,这相对简单,假设我想获取当前正在写入的地址的偏移量,我会做一些事情,例如写出操作码:
lui s8, [upper 20 bits of address]
addi s8, s8, [offset]
当我有 64 位地址时,这不再起作用,因为我必须写出实际的操作码,而不仅仅是使用像
这样的汇编技巧li s8, address
我很困惑如何去做。正确的做法是什么?
我是 RISC-V AL 的新手,但对 AL 并不陌生。 40多年前,我在IBM 360上做过AL,然后是Z80芯片、6502芯片、Wang计算机、Raspberry PI等
我喜欢以下内容:
.文字
la t0,some_function_addr ld t0, 0(t0) 贾尔 t0
some_function_addr:.dword some_function
.数据
让链接器将外部到文件地址放入 some_function_addr 中。
如果这有什么缺点,我想知道。
本质上,我通过将数字的高 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