亲爱的RISCV爱好者们,
我的问题是关于编码
li t1, 0xFF00F007
当使用https://riscvasm.lucasteske.dev/#时,上面的代码编码为
0: 000ff337 lui t1,0xff
4: 00f3031b addiw t1,t1,15
8: 00c31313 slli t1,t1,0xc
c: 00730313 addi t1,t1,7 # ff007 <_sstack+0xee607>
在我幼稚地尝试编码指令时,我想出了
[0] lui sp, 0xFF00F # --pseudo--> I_LI -> FF00F137
[4] addiw t1, sp, 0x7 # --pseudo--> I_LI -> 0071031B
我肯定遗漏了一些东西。
我的问题是:
1. 我的尝试正确吗?
2. 如果正确,为什么https://riscvasm.lucasteske.dev/#会
输出 4 条指令而不是 2 条指令? 似乎 4 条指令的性能不如 2 条指令。
感谢您的意见。
我在 RISCV 解释器https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/中尝试了我自己的代码 ,似乎正确的立即数最终出现在寄存器中。
所以我不知道我做错了什么。
您正在使用 64 位机器,因为代码序列使用
addiw
。问题是 0xFF00F007 是否应该被视为无符号的。
显然,该在线汇编程序将此类常数视为无符号常数。请注意,RARS 将同一构造视为有符号常数,因此它会执行您的代码序列。
它们的序列将 0x00000000FF00F007 加载到
t1
,而您的序列加载 0xFFFFFFFFFF00F007。原因在于在 64 位机器上,
lui
符号会扩展。如果您在康奈尔模拟器上尝试,则必须更改
addiw
为addi
,因为这是一个 32 位机器模拟器,而 32 位 RISC V 机器没有addiw
。